我想模拟一个全局变量并测试它是否已在我的函数中调用。在我的文件中,我定义了一个全局变量“remote”,它实例化了一个主题(RxJS 库)。我只想测试 Subject 的下一个函数是否已使用正确的参数“名称”调用。但是,我无法访问测试文件中的全局变量 remote。我试图在我的设置文件中模拟它,但没有用。
我该怎么做?
const remote = new Subject();
const analytics = {
click: (name) => {
if (name) {
remote.next(name);
}
}
}
module.exports = analytics;
谢谢!
最佳答案
这是个好问题。当你使用 webpack 时,你的个人文件被包装到不同的函数调用中。看看这个 doc .
这个问题最好的部分是,如果您希望代码可测试,它表明了 IOC/DI 的必要性。您可以导出一个 Analytics
类,然后将 remote
注入(inject)到它的构造函数中,而不是在您的本地模块中定义 remote
。
// Analytics.js
export default class Analytics{
constructor(remote) {
this.remote = remote
}
click(name) {
if (name) {
this.remote.next(name)
}
}
}
main.js
import Analytics from './Analytics'
const remote = new Subject()
const analytics = new Analytics(remote)
analysis.click('foo')
将依赖项注入(inject)所有组件/服务会很乏味。 Angular 有 an decent doc关于为什么/如何简化它。希望这对您有所帮助!
//更新
您可以使用 window 定义全局常量并在测试中使用 window.remote
const remote = new Subject()
window.remote = remote
当你想模拟远程时,记得修改它的属性而不是对它的引用。
// test.js
beforeEach(() => {
// wrong !!!
window.remote = {
next(name) { assert(name) }
}
// right
window.remote.next = name => assert(name)
})
关于unit-testing - 如何使用 Jest 访问单元测试中的全局常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243354/