开玩笑-模拟打字稿中的命名类导出

时间:2019-03-11 21:30:26

标签: javascript node.js typescript unit-testing jestjs

我有一个节点模块,该模块可以导出一些类,其中一个是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');
  });
});

但是,由于搜索API尝试连接到url(通过params给出),因此根本不会创建模拟并触发nock错误。

我还尝试过模拟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"

我不确定自己在做什么错。预先谢谢你。

1 个答案:

答案 0 :(得分:1)

模拟整个模块

尝试将jest.mock移动到文件顶部

//index.spec.ts
const search = jest.fn();
jest.mock('node-module-name', () => ({
  Client: jest.fn(() => ({ search }))
}));
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', () => {
    const myClient = createClient({/*params*/});
    myClient.searchByName('abc'); 

    expect(externalModule.Client).toHaveBeenCalled();
    expect(search).toHaveBeenCalledWith('abc');
    externalModule.Client.mockClear();
    search.mockClear();
  });
});

仅模拟客户端

创建search常量并对其进行跟踪。

const search = jest.fn();
externalModule.Client = jest.fn(() => ({ search }));

const client = myModule.createClient(/*params*/);
client.searchByName('abc');

expect(externalModule.Client).toHaveBeenCalled();
expect(search).toHaveBeenCalled();