【问题标题】:Variable Scope Within "describe" and "it" Statements“describe”和“it”语句中的变量范围
【发布时间】:2015-10-24 18:56:00
【问题描述】:

下面是从循环中运行一系列测试的代码。它产生了一些意想不到的行为。似乎第一个操作中的args 的范围正在泄漏到第二个操作中。换句话说,由于某种原因,callback 存在于第二个操作的 args 中。

describe("symlinkType", function() {
  tests.success.forEach(function (test) {
    var args = test[0]
    var expectedType = test[1]
    var should = util.format('should return \'%s\' when src \'%s\'', expectedType, args[0])
    it(should, function (done) {
      var callback = function (err, type) {
        if(err) done(err)
        expect(type).to.equal(expectedType)
        done()
      }
      args.push(callback)
      return symlinkType.apply(null, args)
    })
  })
})

describe("symlinkTypeSync", function()  {
  tests.success.forEach(function (test) {
    var args = test[0]
    var expectedType = test[1]
    var should = util.format('should return \'%s\' when src \'%s\'', expectedType, args[0])
    it(should, function () {
      var value = symlinkTypeSync.apply(null, args)
      expect(value).to.equal(expectedType)
    })
  })
})

我想知道这种行为的原因以及如何解决它。我习惯于当你声明一个变量时,它会改变变量的值,随后的.push() 调用不应该影响第二个语句中的args 变量。这是 mocha 的错吗,it 语句是否泄露了作用域?

【问题讨论】:

  • 您能发布一些示例args 值吗?它的初始值是多少?第一次推送后的价值是多少?第二推?在所有测试结束时?
  • var args=test[0] 只是对test[0] 的引用。未创建新对象。如果出于某种原因test[0] 指向所有tests 内存中的同一个对象,那么args 的范围实际上并没有多大意义。因为每个循环都引用同一个对象
  • @KirillSlatin 你完全正确。我相信我需要克隆test

标签: node.js unit-testing scope mocha.js


【解决方案1】:

正如评论者@KirillSlatin 提到的var args=test[0] 只是对test[0] 数组对象的引用,因此当我将.push() 回调到数组中时,它会将其推入原始数组中。然后,当我在后续函数中调用 test[0] 时,它会拉取更新的对象。这可以通过“克隆”数组对象来防止,这会创建一个新对象,而不仅仅是创建一个引用。

var args = test[0].slice(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多