3

我尝试了很多方法来用玩笑来模拟一个通用函数,但都没有成功。这是我认为正确的方式:

interface ServiceInterface {
    get<T>(): T;
}

class Service implements ServiceInterface {
    get = jest.fn(<T>(): T => {
        throw new Error("Method not implemented.");
    });
}

在编译时它会抛出以下错误:

error TS2416: Property 'get' in type 'Service' is not assignable to the same property in base type 'ServiceInterface'.
  Type 'Mock<{}, any[]>' is not assignable to type '<T>() => T'.
    Type '{}' is not assignable to type 'T'.

你能告诉我正确的方法吗?

谢谢

4

2 回答 2

0

我认为,如果你创建一个接口,让它成为一个通用接口,而不是为每个属性设置通用。

interface ServiceInterface<T> {
  get(): T;
}

当您使用 Jest 创建模拟时:

class Service<T> implements ServiceInterface<T> {
  get = jest.fn<T, []>((): T => null);
}

const instance = new Service<string>();
const result = instance.get(); // typeof result === "string"

对于您的情况,您需要模拟的是返回值get()

interface ServiceInterface {
  get<T>(): T;
}

const mockedGet = jest.fn();

class Service implements ServiceInterface {
  get<T>(): T {
    return mockedGet();
  }
}

const instance = new Service();
mockedGet.mockReturnValue("Hello!");
const result = instance.get<string>(); // now, result is a string
于 2019-05-15T09:28:27.637 回答
0

我使用sinon进行模拟,可以使用以下方式安装:

npm i sinon --save-dev

然后在你的一个测试中模拟你可以做这样的事情:

const mock = sinon.mock(service); // you want the value passed in to mock to be the actualy object being mocked
mock.expects('get').returns(null) // this would expect get to be called once and the return value is null
mock.restore(); // restores all mocked methods
mock.verify(); // verifies the expectations
于 2019-05-14T17:46:44.457 回答