You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jasmine测试定义spy时提示string不可赋值给never类型错误如何解决

错误原因
  1. spyOn 要求第一个参数是持有目标方法的对象,第二个参数是该对象上对应的方法名。你传入的第一个参数是init.getClient,它是Init类的成员方法本身,不是Client类实例,该函数对象上根本不存在foo方法,TypeScript 类型推断无法匹配到合法方法名,因此抛出Argument of type 'string' is not assignable to parameter of type 'never'错误。
  2. 额外类型问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:15:02