unit-testing - 如何使用 Jest 访问单元测试中的全局常量?

标签 unit-testing testing mocking rxjs jestjs

我想模拟一个全局变量并测试它是否已在我的函数中调用。在我的文件中,我定义了一个全局变量“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/

相关文章:

python selenium 多个测试用例

iphone - 有任何用于 UI 单元测试 iPhone 应用程序的工具(不是 SenTestCase)

node.js - 使用 sinon 模拟连接池和测试 url 参数?

java - FilterChainProxy 不会 Autowiring

regex - JMeter:如何知道为什么我在 JMeter 中的正则表达式提取器没有提取数据

ruby - minitest - 模拟 - 期望关键字参数

objective-c - Objective-C 的技巧?

android - PackageNameSuffix 破坏测试 - Robolectric

Rails 3.1 中的 JavaScript 单元测试

objective-c - 使用 OCMock 测试嵌套错误处理