Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jasmine + test an inherited method has been called

Whats the best way to test with Jasmine that an inherited method has been called?

I am only interested in testing whether or not it has been called as I have unit tests set up for the base class.

example is:

YUI().use('node', function (Y) {


    function ObjectOne () {

    }

    ObjectOne.prototype.methodOne = function ()  {
        console.log("parent method");
    }


    function ObjectTwo () {
        ObjectTwo.superclass.constructor.apply(this, arguments);
    }

    Y.extend(ObjectTwo, ObjectOne);

    ObjectTwo.prototype.methodOne = function () {
        console.log("child method");

        ObjectTwo.superclass.methodOne.apply(this, arguments);
    }
})

I want to test that ObjectTwo's inherited methodOne has been called.

Thanks in advance.

like image 605
user502014 Avatar asked Feb 24 '13 19:02

user502014


1 Answers

To do this you can spy the method in the prototype of ObjectOne.

spyOn(ObjectOne.prototype, "methodOne").andCallThrough();
obj.methodOne();
expect(ObjectOne.prototype.methodOne).toHaveBeenCalled();

The only caveat of this method is that it won't check if methodOne was called on the obj object. If you need to make sure it was called on obj object, you can do this :

var obj = new ObjectTwo();
var callCount = 0;

// We add a spy to check the "this" value of the call.    //
// This is the only way to know if it was called on "obj" //
spyOn(ObjectOne.prototype, "methodOne").andCallFake(function () {
    if (this == obj)
        callCount++;

    // We call the function we are spying once we are done //
    ObjectOne.prototype.methodOne.originalValue.apply(this, arguments);
});

// This will increment the callCount. //
obj.methodOne();
expect(callCount).toBe(1);    

// This won't increment the callCount since "this" will be equal to "obj2". //
var obj2 = new ObjectTwo();
obj2.methodOne();
expect(callCount).toBe(1);
like image 114
HoLyVieR Avatar answered Sep 30 '22 18:09

HoLyVieR