Given the following code snippet, how would you create a Jasmine spyOn
test to confirm that doSomething
gets called when you run MyFunction
?
function MyFunction() {
var foo = new MyCoolObject();
foo.doSomething();
};
Here's what my test looks like. Unfortunately, I get an error when the spyOn
call is evaluated:
describe("MyFunction", function () {
it("calls doSomething", function () {
spyOn(MyCoolObject, "doSomething");
MyFunction();
expect(MyCoolObject.doSomething).toHaveBeenCalled();
});
});
Jasmine doesn't appear to recognize the doSomething
method at that point. Any suggestions?
When you call
new MyCoolObject()
you invoke theMyCoolObject
function and get a new object with the related prototype. This means that when youspyOn(MyCoolObject, "doSomething")
you're not setting up a spy on the object returned by thenew
call, but on a possibledoSomething
function on theMyCoolObject
function itself.You should be able to do something like:
Alternatively, as Gregg hinted, we could work with 'prototype'. That is, instead of spying on MyCoolObject directly, we can spy on MyCoolObject.prototype.