Jasmine:测试toHaveBeenCalledWith(params),其中params是一个对象

Don*_*n H 3 javascript testing jasmine

我正在使用Jasmine进行一些测试,在寻找间谍的预期参数时会产生奇怪的结果.

我正在测试使用toHaveBeenCalledWith()方法并寻找类似这样的东西:

{
  foo: bar,
  thing: [1,2,3],
  etc: function() { blah; }
}
Run Code Online (Sandbox Code Playgroud)

它给出了一个失败,但错误消息似乎确认实际上找到了完全相同的对象.

可能出现这种情况的原因是什么?

Dav*_*mes 5

等效函数定义不相等.所以,

function() { return 'blah'; } == function() { return 'blah'; } // returns false
Run Code Online (Sandbox Code Playgroud)

使用toHaveBeenCalledWith()时,您必须引用相同的函数定义,以使Jasmine认为它等于传递给spied对象方法的参数.您是否可以将新的对象定义(如您在问题中包含的对象)传递给toHaveBeenCalledWith()?这不会通过Jasmine断言.

这是我跑的Jasmine规范,说明了我所说的内容.有一个成功的例子和一个失败的例子:

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() { }
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 如果我的函数定义是在函数调用中构造的,如何使它工作?就像我有'''函数F(param){return {construct:function(){return param; }''''.如何测试该功能是否正确构建? (5认同)