如何使用Jest在单元测试中访问全局常量?

时间:2017-09-15 15:49:13

标签: unit-testing testing mocking rxjs jest

我想模拟一个全局变量并测试它是否已在我的函数中调用。在我的文件中,我定义了一个全局变量“remote”,它实现了一个Subject(RxJS库)。我只想测试是否使用正确的参数“name”调用了Subject的下一个函数。但是,我无法在我的测试文件中访问全局变量remote。我试图在我的安装文件中模拟它,但不起作用。

我该怎么做?

const remote = new Subject();
const analytics = {
  click: (name) => {
    if (name) {
      remote.next(name);
    }
  }
}
module.exports = analytics;

谢谢!

1 个答案:

答案 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)
})