Jest - макет именованного класса-экспорта в машинописи - PullRequest
0 голосов
/ 12 марта 2019

У меня есть модуль узла, который экспортирует несколько классов, одним из которых является Client, который я использую для создания клиента (с несколькими API-интерфейсами в качестве методов).

Я пытаюсь проверитьмой модуль, который использует этот модуль узла как зависимость, используя Jest.Однако я не смог успешно смоделировать один метод (скажем, search()) в классе Client.

Вот моя спецификация для 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 (заданным через params).

Я также пытался издеваться над классом 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 Ответ

1 голос
/ 12 марта 2019

Mocking весь модуль

Попробуйте переместить 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();
  });
});

Mocking only Client

Создать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...