2017-01-11 18 views
0

У меня есть функция, что я ввожу из другого файла:sinon.spy возвращает ложные на импортируемую функции, даже если функция вызывается

import { getMenu } from '../utils/request'; 

Тогда у меня есть метод, который вызывает эту функцию, я хочу для теста (я хочу, чтобы проверить, что метод действительно вызывает эту функцию):

it('handleDateChange should call getMenu when NOT passed state date',()=> { 
    const dashboard = shallow(<Dashboard/>); 
    const today = new Date(); 

    var spy = sinon.spy(getMenu); 

    dashboard.setState({ selectedDate: 'blah' }); 

    dashboard.instance().handleDateChange(today); 
    expect(spy.called).toBe(true); 
    }); 

самое смешное, я получаю некоторые консольный выход из метода getMenu, так что я знаю, что метод был вызван.

Но spy.called все еще возвращает false.

Что я делаю неправильно?

ответ

1

Проблема заключается в том, что вы не можете подделывать материал в модулях с синоном, что это повлияло на другие места, если этот модуль был импортирован. Таким образом, вы только следите за функцией, которая импортируется в ваш тест. Решение при использовании шутки было бы издеваться над модулем и импортировать его в ваш тест.

import { getMenu } from '../utils/request'; 

jest.mock('../utils/request',() => ({getMenu: jest.fn()})) 

it('handleDateChange should call getMenu when NOT passed state date',()=> { 
    const dashboard = shallow(<Dashboard/>); 
    const today = new Date(); 

    dashboard.setState({ selectedDate: 'blah' }); 

    dashboard.instance().handleDateChange(today); 
    expect(getMenu).toHaveBeenCalled(); 
}); 

Итак, сначала мы импортируем модуль, то дразнить его так, чтобы getMenu это шутка шпион. Обратите внимание, что когда тесты запускают все вызовы jest.mock, вызываются до того, как все материалы импорта произойдут, поэтому в вашем тесте и в модуле, который вы хотите протестировать, модуль request справедлив и объект с getMenu, который является шпионом. Импортируя модуль в свой тест, вы также можете проверить, что он был вызван.