【发布时间】:2021-01-21 02:15:53
【问题描述】:
我想测试我的一个 ES6 模块是否以特定方式调用另一个 ES6 模块。使用Jasmine,这非常简单--
申请代码:
// 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);
});
});
Jest 的等价物是什么?我觉得这是一件很简单的事情,但我一直在努力解决这个问题。
我最接近的方法是将imports 替换为requires,并将它们移动到测试/函数中。这两件事都不是我想做的。
// 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 中是可能的。
【问题讨论】:
-
我在这个项目中使用 Babel,所以我不介意现在继续将
imports 转换为requires。不过感谢您的提醒。 -
如果我有 ts 类 A 并且它调用了一些函数让我们说 B 类的 doSomething() 我们如何模拟,以便 A 类调用 B 类函数 doSomething() 的模拟版本跨度>
-
对于那些想更多地发现这个问题的人github.com/facebook/jest/issues/936
标签: javascript node.js mocking ecmascript-6 jestjs