为什么循环描述块会导致失败?

Why do looped describe blocks cause failures?

我想用 jest 来测试同一事物的不同实现。界面始终相同,因此测试也始终完全相同。

为了避免重复,我尝试将整个 dontMock 和 describe 内容放入一个循环中,如下所示:

var implementations = [ 'first', 'second', 'third' ]

for(i in implementations) {
  var name = implementations[i],
      path = "../js/components/fancy_" + name

  jest.dontMock(path)
  func = require(path)

  describe(name + " implementation", function() {
    it("does things", function() {
      expect(func()).toBe("one with the world")
    })
  })
}

只要 implementations 数组只有一个元素,就可以了。一旦我添加更多,来自某些实现的失败也会显示为其他实现的失败。如果所有实施都通过,我将获得绿色测试。

我还尝试将 dontMock 部分移到一个单独的循环中,但这没有帮助。

我认为 describe() 是异步运行的,而不是你的 for .. in 循环。所以希望解决方案应该是将每个描述调用包装在 IIFE 中:

var implementations = [ 'first', 'second', 'third' ]

for(i in implementations) {
  var name = implementations[i],
      path = "../js/components/fancy_" + name

  jest.dontMock(path)
  func = require(path)
  (function(func) {
    describe(name + " implementation", function() {
      it("does things", function() {
        expect(func()).toBe("one with the world")
      })
    })
  })(func)
}

这看起来不太干净,您可能应该重新组织代码以避免出现这种情况。