gpt4 book ai didi

javascript - 如何在 Jasmine.js 中使用带有 toHaveBeenCalledWith 的 spy 和可变数组?

转载 作者:数据小太阳 更新时间:2023-10-29 05:36:37 25 4
gpt4 key购买 nike

我有一些代码以数组作为单个参数调用回调函数。调用回调后,代码更改数组内容。它类似于这段代码:

function myCode( callback ) {
var someArray = [ 1, 2, 3, 4 ];
callback( someArray );

// change someArray in arbitrary ways
someArray.splice( 2 );
...
}

现在,我想验证是否使用正确的数组内容调用回调。使用 Jasmine.js 我会这样写我的规范:

describe( "My code", function() {
var callback;

beforeEach( function() {
callback = jasmine.createSpy( "My callback" );
myCode( callback );
});

it( "calls the callback and passes the correct array", function() {
expect( callback ).toHaveBeenCalledWith( [ 1, 2, 3, 4 ] );
});
});

这失败了。问题是,Jasmine.js 记录了数组但没有复制它。由于数组在调用后发生更改,因此 expect()-Line 失败,即使实际调用满足了预期。可变对象也会出现同样的问题。

如何测试这样的代码?

最佳答案

Jasmine 会浅拷贝传递给 spy 的 arguments,这意味着 arguments 对象将引用调用它的相同对象(在您的case arguments 将仅引用 someArray 对象。

spy 实现的 Jasmine 代码引用:

  spy = function() {
callTracker.track({
object: this,
args: Array.prototype.slice.apply(arguments)
});
return spyStrategy.exec.apply(this, arguments);
};

数组的深拷贝 (arguments) 不可能作为通用解决方案,问题在 link 中解释。 .

您的问题的解决方案可能是为您的特定用例编写您自己的回调和匹配器,您知道您必须准确复制(克隆)的内容。

关于javascript - 如何在 Jasmine.js 中使用带有 toHaveBeenCalledWith 的 spy 和可变数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com