以下是从循环中运行一系列测试的代码。它产生了一些意想不到的行为。似乎第一次操作中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
声明泄漏的范围吗?
答案 0 :(得分:0)
作为评论者@KirillSlatin提到var args=test[0]
只是对test[0]
数组对象的引用,因此当我.push()
回调到数组时,它会将其推送到原始数组中。然后当我在后续函数中调用test[0]
时,它会拉动更新的对象。这可以通过“克隆”数组对象来防止,这会创建一个新的,而不是仅仅创建一个引用。
var args = test[0].slice(0)