Jasmine: Testing toHaveBeenCalledWith(params) where params is an object

jasmine, javascript, testing

Solution

Equivalent function definitions are not equal. So,

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

You have to reference the same function definition when using toHaveBeenCalledWith() for Jasmine to consider it equal to the argument passed to the spied object's method. Are you maybe passing in a new object definition (like the object you included in your question) to toHaveBeenCalledWith()? That will not pass the Jasmine assertion.

Here is the Jasmine spec I ran which illustrates what I said. There is a succeeding example and a failing example:

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

Problem

I'm doing some testing with Jasmine, having a strange result when looking for expected params as a result of a Spy. I'm testing using the toHaveBeenCalledWith() method and looking for something like this: ``` { foo: bar, thing: [1,2,3], etc: function() { blah; } } ``` It gives a fail, but the error message seems to confirm the exact same object is actually being found. Any reasons why this might be the case?

Original source