Javascript Jasmine:测试是否已调用(params),其中params是一个对象
我正在用Jasmine做一些测试,在寻找间谍的预期参数时有一个奇怪的结果 我正在使用toHaveBeenCalledWith()方法进行测试,并寻找类似以下内容:Javascript Jasmine:测试是否已调用(params),其中params是一个对象,javascript,testing,jasmine,Javascript,Testing,Jasmine,我正在用Jasmine做一些测试,在寻找间谍的预期参数时有一个奇怪的结果 我正在使用toHaveBeenCalledWith()方法进行测试,并寻找类似以下内容: { foo: bar, thing: [1,2,3], etc: function() { blah; } } 它给出了一个失败消息,但错误消息似乎确认了实际找到的是完全相同的对象 为什么会出现这种情况?等效函数定义不相等。所以 function() { return 'blah'; } == function() {
{
foo: bar,
thing: [1,2,3],
etc: function() { blah; }
}
它给出了一个失败消息,但错误消息似乎确认了实际找到的是完全相同的对象
为什么会出现这种情况?等效函数定义不相等。所以
function() { return 'blah'; } == function() { return 'blah'; } // returns false
当使用贾斯敏的ToHaveBeNeLeDeWe()时,必须引用相同的函数定义,以将其等同于传递给SPED对象的方法的参数。是否将新的对象定义(如问题中包含的对象)传递给toHaveBeenCalledWith()?这不会通过茉莉花的断言
这是我运行的茉莉花规格说明了我所说的。有一个成功的例子和一个失败的例子:
describe("A spy example", function() {
var baz = {
foo: 'bar',
thing: [1,2,3],
etc: function() { }
};
beforeEach(function() {
spyOn(baz, 'etc');
baz.etc(baz);
});
it("succeeds", function() {
expect(baz.etc).toHaveBeenCalledWith(baz);
});
it("fails", function() {
expect(baz.etc).toHaveBeenCalledWith({
foo: 'bar',
thing: [1,2,3],
etc: function() { }
});
});
});
一个可能的解决方案是使用:自定义非对称相等测试仪。让测试人员决定如何确定相等性。 例如:
describe("A spy example", function() {
var baz = {
foo: 'bar',
thing: [1,2,3],
etc: function() { }
};
beforeEach(function() {
spyOn(baz, 'etc');
baz.etc(baz);
});
it("succeeds", function() {
expect(baz.etc).toHaveBeenCalledWith(baz);
});
var customTester = {
asymmetricMatch: function(actual) {
return actual.foo === 'bar' &&
actual.thing.length === 3 // && ... ( any deep comparison method you wish to use)
}
};
it("succeeds too", function() {
expect(baz.etc).toHaveBeenCalledWith(customTester);
});
}))
希望这有帮助。非常感谢。我用对特定方法的引用替换了内联函数,现在所有函数都可以工作了。如果我的函数定义是在函数调用中构造的,如何使它工作?就像我有“函数F(param){return{constructed:function(){return param;}}}}”一样。如何测试该函数是否正确构造?