通常,我具有导入到React组件中的功能,这些功能我想使用玩笑/酶来进行测试。
通常,我可以通过wrapper.instance()。functionName访问组件中定义的函数,然后测试该函数是否已被调用。类似地,当在测试中安装组件时,我可以传递一个模拟函数作为道具,然后检查该组件是否已被调用。但是,我没有测试导入组件(未在内部定义或作为props)的函数的方法。
是否有一种方法可以使用玩笑/酶来定义将在组件测试中使用的全局模拟功能,该功能将覆盖已导入到我正在测试的组件中的同名功能的实现? / p>
答案 0 :(得分:1)
是的,有可能。
模拟模块或模块中的各个功能的方法有很多。
这里是一个例子:
lib.js
export const importedFunc = () => 'original';
code.js
import * as React from 'react';
import { importedFunc } from './lib';
export class SimpleComponent extends React.Component {
render() {
return (<div>{ importedFunc() }</div>);
}
}
code.test.js
import * as React from 'react';
import { shallow } from 'enzyme';
import * as lib from './lib';
import { SimpleComponent } from './code';
test('SimpleComponent', () => {
const spy = jest.spyOn(lib, 'importedFunc');
spy.mockReturnValue('mocked');
const wrapper = shallow(<SimpleComponent />);
expect(wrapper.html()).toBe('<div>mocked</div>'); // Success!
expect(spy).toHaveBeenCalled(); // Success!
});
jest.spyOn
将功能包装在间谍程序中,您可以更改其methods,mockReturnValue
等mockImplementation
的行为方式。>
jest.mock
可让您模拟整个模块。
Manual mocks允许您创建可在测试中使用的模块模拟。