可变范围"描述"和"它"声明

时间:2015-08-02 16:52:04

标签: node.js unit-testing scope mocha

以下是从循环中运行一系列测试的代码。它产生了一些意想不到的行为。似乎第一次操作中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变量。这是摩卡的错吗,是it声明泄漏的范围吗?

1 个答案:

答案 0 :(得分:0)

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

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