Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jasmine:测试是否已调用(params),其中params是一个对象_Javascript_Testing_Jasmine - Fatal编程技术网

Javascript Jasmine:测试是否已调用(params),其中params是一个对象

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() {

我正在用Jasmine做一些测试,在寻找间谍的预期参数时有一个奇怪的结果

我正在使用toHaveBeenCalledWith()方法进行测试,并寻找类似以下内容:

{
  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;}}}}”一样。如何测试该函数是否正确构造?