我想模拟一个全局变量并测试它是否已在我的函数中调用。在我的文件中,我定义了一个全局变量“remote”,它实现了一个Subject(RxJS库)。我只想测试是否使用正确的参数“name”调用了Subject的下一个函数。但是,我无法在我的测试文件中访问全局变量remote。我试图在我的安装文件中模拟它,但不起作用。
我该怎么做?
const remote = new Subject();
const analytics = {
click: (name) => {
if (name) {
remote.next(name);
}
}
}
module.exports = analytics;
谢谢!
答案 0 :(得分:1)
这是一个很好的问题。当您使用webpack时,您的个人文件将被包装到不同的函数调用中。看看这个doc
这个问题的最好的部分是,如果你希望你的代码是可测试的,它表明了IOC / DI的必要性。您可以导出remote
类,然后将Analytics
注入其构造函数,而不是在本地模块中定义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')
将依赖项注入所有组件/服务会很繁琐。 Angular对于为什么/如何简化它有an decent doc。希望这有用!
//更新
您可以使用窗口定义全局常量,并使用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)
})