Это мой исходный код, и я недавно добавил onWindowClick.
componentDidMount() {
window.addEventListener('mouseup', this.onWindowMouseUp);
window.addEventListener('click', this.onWindowClick, true);
...
@bind
onWindowClick(e) {
if (!this.mouseInProgress) {
return;
}
e.stopPropagation();
}
/**
* Window mouse up handler.
*/
@bind
@debounce(0)
onWindowMouseUp() {
this.mousePoint = null;
this.mouseInProgress = false;
}
Функция выглядит хорошо, поэтому я пытаюсь добавить еще один тест для onWindowClick
describe('onWindowClick method', () => {
const e = {
stopPropagation: jest.fn(),
clientX: 500,
clientY: 700,
};
beforeEach(() => {
instance.mouseInProgress = false;
instance.onWindowClick();
});
test('should not stop propogation', () => {
setTimeout(() => {
instance.onWindowClick(e);
expect(e.stopPropagation).toHaveBeenCalled();
}, 0);
});
Каким-то образом этот существующий тест не проходит модульное тестирование, а приведенное выше проходит. (ОЧЕНЬ СТРАННО)
describe('onWindowMouseUp method', () => {
beforeEach(() => {
instance.mousePoint = null;
instance.mouseInProgress = false;
instance.onWindowMouseUp();
});
test('should reset mousePoint', (done) => {
setTimeout(() => {
expect(instance.mousePoint).toBeNull();
done();
}, 0);
});
Ошибка:
console.error
Error: Uncaught [Error: expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0]
at reportException (.:62:24)
at Timeout.callback [as _onTimeout] .(.)
at listOnTimeout (..)
. at processTimers (i.) JestAssertionError:
.expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
at .:124:33
at Timeout.callback [as _onTimeout] .(.)
at listOnTimeout (.:549:17).
. at processTimers (..:492:7) {
matcherResult: { message: [Function (anonymous)], pass: false }
}
at VirtualConsole.<anonymous> (..:29:45)
at reportException (.:66:28)
at .Timeout.callback [as _onTimeout] (.:645:7)
.
Error: expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
at /U...:124:33
at Timeout.callback [as _onTimeout] (/..)
at listOnTimeout (i.)
at processTimers (in.).
Если я удалю тестовый пример, все тесты пройдут; Странно, что вновь добавленный тестовый пример каким-то образом влияет на другой отдельный тест.
У меня была instance
переменная вне тестов.
let instance
beforeEach(() => {
...
wrapper = shallow(<V {...props} />);
instance = wrapper.instance();
instance.rootRef.current = {};
instance.graphRootRef.current = {};
wrapper.setState({
boundsById,
});
EDIT: каким-то образом я получаю ошибку из существующего метод, и трассировка стека показывает, что здесь появляется ошибка:
expect(e.stopPropagation).not.toHaveBeenCalled();