我开始认为这是不可能的,但是无论如何我都想问。
我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易-
应用程式码:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
和测试代码:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
笑话相当于什么?我觉得这是一件很容易的事情,但是我一直想把头发弄掉。
我最接近的是将import
s 替换为require
s,并将其移入测试/函数中。都不是我想做的事情。
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
为了获得加分,我很想在其中的函数dependency.js
为默认导出时使整个工作正常进行。但是,我知道监视默认导出在Jasmine中不起作用(或者至少我永远无法使它起作用),因此我也不希望在Jest中也有可能。
我已经能够通过使用涉及到的hack来解决此问题import *
。它甚至适用于命名和默认导出!
对于命名出口:
// dependency.js
export const doSomething = (y) => console.log(y)
// myModule.js
import { doSomething } from './dependency';
export default (x) => {
doSomething(x * 2);
}
// myModule-test.js
import myModule from '../myModule';
import * as dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
dependency.doSomething = jest.fn(); // Mutate the named export
myModule(2);
expect(dependency.doSomething).toBeCalledWith(4);
});
});
或默认导出:
// dependency.js
export default (y) => console.log(y)
// myModule.js
import dependency from './dependency'; // Note lack of curlies
export default (x) => {
dependency(x * 2);
}
// myModule-test.js
import myModule from '../myModule';
import * as dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
dependency.default = jest.fn(); // Mutate the default export
myModule(2);
expect(dependency.default).toBeCalledWith(4); // Assert against the default
});
});
正如Mihai Damian在下面正确指出的那样,这是对的模块对象进行了变异dependency
,因此它将“泄漏”到其他测试中。因此,如果使用这种方法,则应存储原始值,然后在每次测试后再次将其重新设置。要使用Jest轻松实现此目的,请使用spyOn()方法代替,jest.fn()
因为它支持轻松恢复其原始值,因此避免了前面提到的“泄漏”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句