【问题标题】:Jasmine: Testing toHaveBeenCalledWith(params) where params is an objectJasmine:测试 toHaveBeenCalledWith(params) 其中 params 是一个对象
【发布时间】:2014-02-22 21:00:51
【问题描述】:

我正在对 Jasmine 进行一些测试,在寻找预期的参数作为间谍的结果时有一个奇怪的结果。

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

{
  foo: bar,
  thing: [1,2,3],
  etc: function() { blah; }
}

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

有什么理由会出现这种情况?

【问题讨论】:

    标签: javascript testing jasmine


    【解决方案1】:

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

    function() { return 'blah'; } == function() { return 'blah'; } // returns false
    

    在使用 toHaveBeenCalledWith() 时,您必须引用相同的函数定义,以便 Jasmine 认为它等于传递给间谍对象方法的参数。您是否可能将新的对象定义(例如您在问题中包含的对象)传递给 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() { }
            });
        });
    });
    

    【讨论】:

    • 非常感谢。我用对特定方法的引用替换了内联函数,现在一切正常。
    • 如果我的函数定义是在函数调用内部构造的,如何使它工作?就像我有'''function F(param){return {构造:function(){return param; } } '''。如何测试该函数构造是否正确?
    【解决方案2】:

    一个可能的解决方案是使用:自定义不对称相等测试器。让测试人员决定如何确定相等性。 示例:

    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);
    });
    

    });

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 2011-07-27
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2014-12-14
      相关资源
      最近更新 更多