【发布时间】:2022-05-12 19:54:09
【问题描述】:
我有一个导出几个类的节点模块,其中一个是Client,我用它来创建一个客户端(有几个 API 作为方法)。
我正在尝试使用 Jest 测试我的模块,该模块将此节点模块用作依赖项。但是,我无法成功模拟 Client 类中的一种方法(比如 search())。
这是我对myModule 的规范:
//index.spec.ts
import * as nock from 'nock';
import * as externalModule from 'node-module-name';
import { createClient } from './../../src/myModule';
describe(() => {
beforeAll(() => {
nock.disableNetConnect();
});
it('test search method in my module', () => {
jest.mock('node-module-name');
const mockedClient = <jest.Mock<externalModule.Client>>externalModule.Client;
const myClient = createClient({/*params*/}); //returns instance of Client class present in node module by executing Client() constructor
myClient.searchByName('abc'); //calls search API - I need to track calls to this API
expect(mockedClient).toHaveBeenCalled();
expect(mockedClient.prototype.search).toHaveBeenCalledWith('abc');
});
});
然而,这根本不会创建模拟,并会触发一个 nock 错误,因为搜索 API 会尝试连接到 url(通过参数给出)。
我也尝试过像下面这样模拟 Client 类。虽然成功地为 Client 类和搜索 API 创建了一个模拟(验证 search() 也通过控制台日志模拟),但当我尝试检查是否已调用 search() 时,它给了我一个错误。
externalModule.Client = jest.fn(() => { return { search: jest.fn(() => Promise.resolve('some response')) } });
//creates the mock successfully, but not sure how to track calls to 'search' property
const client = myModule.createClient(/*params*/);
client.searchByName('abc');
expect(externalModule.Client).toHaveBeenCalled(); //Successful
expect(externalModule.Client.prototype.search).toHaveBeenCalled(); //returns error saying "jest.fn() value must be a mock function or spy, Received: undefined"
我不确定我做错了什么。提前谢谢你。
【问题讨论】:
标签: javascript node.js typescript unit-testing jestjs