thi*_*ign 12 unit-testing mocking spy reactjs jestjs
假设我有一个导出默认功能的简单文件:
// UniqueIdGenerator.js
const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);
export default uniqueIdGenerator;
Run Code Online (Sandbox Code Playgroud)
我会这样使用:
import uniqueIdGenerator from './UniqueIdGenerator';
// ...
uniqueIdGenerator();
Run Code Online (Sandbox Code Playgroud)
我想在测试中断言在保持原始功能的同时调用了此方法。jest.spyOn但是,我需要一个对象以及一个函数名称作为参数。您如何以一种干净的方式做到这一点?还有一个类似的GitHub的问题为jasmine兴趣的人。
Hub*_*ris 36
这是一种默认导出的方法,无需修改导入(甚至在测试中根本不需要导入):
const actual = jest.requireActual("./UniqueIdGenerator");
const spy = jest.spyOn(actual, "default");
Run Code Online (Sandbox Code Playgroud)
小智 29
还可以模拟导入并将原始实现作为模拟实现传递,例如:
import uniqueIdGenerator from './UniqueIdGenerator'; // this import is a mock already
jest.mock('./UniqueIdGenerator.js', () => {
const original = jest. requireActual('./UniqueIdGenerator')
return {
__esModule: true,
default: jest.fn(original.default)
}
})
test(() => {
expect(uniqueIdGenerator).toHaveBeenCalled()
})
Run Code Online (Sandbox Code Playgroud)
thi*_*ign 15
我最终放弃了默认导出:
// UniqueIdGenerator.js
export const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样使用和监视它:
import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'uniqueIdGenerator');
Run Code Online (Sandbox Code Playgroud)
一些建议将它们包装在const对象中,然后导出。我想您也可以使用包装类。
但是,如果您不能修改该类,那么仍然有一个(不太好的)解决方案:
import * as UniqueIdGenerator from './UniqueIdGenerator';
// ...
const spy = jest.spyOn(UniqueIdGenerator, 'default');
Run Code Online (Sandbox Code Playgroud)
小智 12
使用“default”作为spyOn 函数中的第二个参数。
import * as MyHelperMethod from '../myHelperMethod';
jest.spyOn(MyHelperMethod, 'default');
Run Code Online (Sandbox Code Playgroud)
dec*_*ele 10
仅模拟默认导出或任何其他导出,但将模块中的其余导出保留为原始导出:
import myDefault, { myFunc, notMocked } from "./myModule";
jest.mock("./myModule", () => {
const original = jest.requireActual("./myModule");
return {
__esModule: true,
...original,
default: jest.fn(),
myFunc: jest.fn()
}
});
describe('my description', () => {
it('my test', () => {
myFunc();
myDefault();
expect(myFunct).toHaveBeenCalled();
expect(myDefault).toHaveBeenCalled();
myDefault.mockImplementation(() => 5);
expect(myDefault()).toBe(5);
expect(notMocked()).toBe("i'm not mocked!");
})
});
Run Code Online (Sandbox Code Playgroud)
在某些情况下,您必须模拟导入才能监视默认导出:
import * as fetch from 'node-fetch'
jest.mock('node-fetch', () => ({
default: jest.fn(),
}))
jest.spyOn(fetch, 'default')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4421 次 |
| 最近记录: |