Jasmine测试定义spy时提示string不可赋值给never类型错误如何解决
错误原因
spyOn要求第一个参数是持有目标方法的对象,第二个参数是该对象上对应的方法名。你传入的第一个参数是init.getClient,它是Init类的成员方法本身,不是Client类实例,该函数对象上根本不存在foo方法,TypeScript 类型推断无法匹配到合法方法名,因此抛出Argument of type 'string' is not assignable to parameter of type 'never'错误。- 额外类型问题:
Init类构造函数要求入参为URL类型,直接传入字符串'test-url'本身也不符合类型定义。
解决方案
你想要验证getClient返回的Client实例的foo调用情况,有两种常用实现方式:
方案1:Mock getClient返回带Spy的实例(单元测试推荐)
直接 stub 掉getClient方法,返回你提前构造好的带spy的模拟Client实例,完全隔离外部依赖:
it('foo should be invoked', done => { // 构造符合类型要求的URL参数 const testUrl = new URL('http://test-url'); const init = new Init(testUrl); // 构造模拟Client实例,并给foo方法打spy const mockClient = new Client(testUrl); const fooSpy = spyOn(mockClient, 'foo'); // stub getClient方法,固定返回我们构造的模拟实例 spyOn(init, 'getClient').and.returnValue(mockClient); // --- 这里替换为你实际触发业务逻辑的代码 // 示例业务逻辑: // const client = init.getClient(testUrl); // client.foo('test params'); // --- expect(fooSpy).toHaveBeenCalledTimes(1); done(); });
方案2:基于真实返回的实例打Spy
如果你不需要mockgetClient的逻辑,需要走真实的实例创建流程,可以先调用getClient拿到真实实例后再打spy:
it('foo should be invoked', done => { const testUrl = new URL('http://test-url'); const init = new Init(testUrl); // 先拿到真实返回的Client实例 const client = init.getClient(testUrl); const fooSpy = spyOn(client, 'foo'); // --- 执行业务逻辑 // --- expect(fooSpy).toHaveBeenCalledTimes(1); done(); });
注意:你预期写法里的
initCommand.getClient.foo是不合法的,getClient是方法,只有调用后才会返回Client实例,本身不会持有Client实例的属性。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

