// ./index.js
import { Component } from 'react';
export default class Test extends Component {
method () {
console.log('method()');
}
do () {
this.method();
func();
}
render () {
return null;
}
}
export function func () {
console.log('func()');
}
// ./index.test.js
import { shallow } from 'enzyme';
import React from 'react';
import * as Test from './index';
describe('<Test>', () => {
const component = shallow(<Test.default/>),
method_spy = jest.spyOn(component.instance(), 'method'),
func_spy = jest.spyOn(Test, 'func');
test('func()', () => {
component.instance().do();
expect(method_spy).toHaveBeenCalledTimes(1); // passed
expect(func_spy).toHaveBeenCalledTimes(1); // failed
});
});
我想监视组件外部的功能,但是效果不佳。
我收到类似Expected mock function to have been called one time, but it was called zero times.
在这种情况下,我不想使用模仿()方法代替spyOn()。
有办法解决吗?谢谢您的阅读。 :D
答案 0 :(得分:1)
它不起作用,因为此行:
const func_spy = jest.spyOn(Test, 'func');
...正在模块导出上为func
...
...但是,Test.do
不会为func
调用模块导出,而是直接调用func
。
有两种解决方法。
一种方法是将func
移到其自己的模块中。
然后将模块导出导入到index.js
中,并在Test.do
中调用...
...并且func
的模块导出被包裹在间谍中时,间谍将被Test.do
调用。
另一个选择是注意"ES6 modules support cyclic dependencies automatically",以便可以将模块导入自身。
如果将模块导入自身,则Test.do
可以为func
调用模块导出:
import { Component } from 'react';
import * as index from './index'; // <= import the module into itself
export default class Test extends Component {
method() {
console.log('method()');
}
do() {
this.method();
index.func(); // <= use the module
}
render() {
return null;
}
}
export function func() {
console.log('func()');
}
...以及用于func
的模块导出上的间谍将按预期方式被调用:
import { shallow } from 'enzyme';
import React from 'react';
import * as Test from './index';
describe('<Test>', () => {
const component = shallow(<Test.default />),
method_spy = jest.spyOn(component.instance(), 'method'),
func_spy = jest.spyOn(Test, 'func');
test('func()', () => {
component.instance().do();
expect(method_spy).toHaveBeenCalledTimes(1); // Success!
expect(func_spy).toHaveBeenCalledTimes(1); // Success!
});
});