Как издеваться над созданным объектом с помощью Jest - PullRequest
1 голос
/ 25 марта 2019

У меня есть файл (src / dclient), который делает это:

import DataClient from 'src/clients/data'

const DClient = new DataClient({ id: 'xxx' })
export default DClient

И у меня есть файл (который я пытаюсь проверить), который делает это:

import DClient from src/dclient

// Some code

DClient.alert('hello')

Я пытаюсь написать ожидания на Dclient.alert, но не могу этого сделать. Я пытался настроить шутник как:

alertMock = jest.fn();
require('src/dclient').alert = alertMock

Но это не работает, когда я проверяю alertMock.mock.calls, хотя я знаю, что он был вызван. Я думаю, потому что dclient возвращает экземпляр и на самом деле не определено предупреждение.

Как я могу настроить эту шутку, чтобы я мог написать ожидания по тревоге?

Ответы [ 2 ]

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

Есть несколько способов проверить это.

Способ, которым вы пытаетесь, работает нормально, вам просто нужно изменить его на:

test('code', () => {
  const alertMock = jest.fn();
  require('src/dclient').default.alert = alertMock;  // <= mock alert on 'default'

  require('./code');  //  <= require the code that calls DClient.alert('hello')
  expect(alertMock).toHaveBeenCalledWith('hello');  // Success!
})

... потому что src/dclient - это модуль ES6 с default экспортом.


Подход, который я, вероятно, использовал бы, состоит в том, чтобы смоделировать функцию alert в классе DataClient:

import DataClient from 'src/clients/data';

test('code', () => {
  const alertSpy = jest.spyOn(DataClient.prototype, 'alert');
  alertSpy.mockImplementation(() => {});

  require('./code');  //  <= require the code that calls DClient.alert('hello')
  expect(alertSpy).toHaveBeenCalledWith('hello');  // Success!
})
0 голосов
/ 25 марта 2019

Jest обладает действительно хорошо сделанной функцией автоматического моделирования , которая генерирует jest.fn() для каждого метода на экспортируемом объекте, поэтому вы можете просто:

import DClient from 'src/dclient'; // import the module
jest.mock('src/dclient'); // generate auto-mock

describe('alert', () => {
    beforeAll(() => {
        DClient.alert.mockReturnValue(true);
        // ^ not really needed in the alert case, but you'll get
        // error if the exported object doesn't have alert method
    });

    it('should have been called', () => {
        DClient.alert('hello');
        expect(DClient.alert).toHaveBeenCalledWith()
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...