Cheat Sheet for Javascript Testing with Jasmine
Jasmine is the default unit testing framework that I use when writing javascript, however my poor brain can’t always remember all the different ways of getting things to work. There are quite a number of cheat sheets out on the internet including:
They don’t quite cover all the examples as well. Here’s my contributions to demonstrate some of the common uses.
describe("jasmine", function () {
describe("basic invocations", function () {
var SampleDependency = function () {
return {
usefulMethod:function (firstParameter, secondParameter) {
},
anotherUsefulMethod:function () {
}
};
};
var Consumer = function (dependency) {
return {
run:function () {
dependency.usefulMethod("first", "second");
},
runSecondMethod:function () {
dependency.anotherUsefulMethod();
},
runWithRequiredCallback:function(callback) {
callback("an argument");
}
};
};
it("should spy on an existing function", function () {
// given
var dependency = new SampleDependency();
spyOn(dependency, "usefulMethod");
var consumer = new Consumer(dependency);
// when
consumer.run();
// then
expect(dependency.usefulMethod).toHaveBeenCalled();
expect(dependency.usefulMethod).toHaveBeenCalledWith("first", "second");
expect(dependency.usefulMethod).toHaveBeenCalledWith(jasmine.any(String), jasmine.any(String));
expect(dependency.usefulMethod.callCount).toEqual(1);
expect(dependency.usefulMethod.mostRecentCall.args).toEqual(["first", "second"]);
});
it("should demonstrate resetting of the spy", function () {
// given
var dependency = new SampleDependency();
spyOn(dependency, "usefulMethod");
dependency.usefulMethod();
dependency.usefulMethod.reset();
// when
dependency.usefulMethod();
// then
expect(dependency.usefulMethod).toHaveBeenCalled();
expect(dependency.usefulMethod.callCount).toEqual(1);
});
it("should demonstrate creating a spy object with prepopulated methods", function () {
// given
var dependency = jasmine.createSpyObj("dependency", ["usefulMethod", "anotherUsefulMethod"]);
var consumer = new Consumer(dependency);
// when
consumer.run();
consumer.runSecondMethod();
// then
expect(dependency.usefulMethod).toHaveBeenCalled();
expect(dependency.anotherUsefulMethod).toHaveBeenCalled();
});
it("should demonstrate creating a stub object", function () {
// given
var dependency = jasmine.createSpyObj("dependency", ["usefulMethod", "anotherUsefulMethod"]);
var consumer = new Consumer(dependency);
var stubbedCallback = jasmine.createSpy("stub callback");
// when
consumer.runWithRequiredCallback(stubbedCallback);
// then
expect(stubbedCallback).toHaveBeenCalled();
expect(stubbedCallback).toHaveBeenCalledWith("an argument");
});
});
describe("returning a value", function () {
var Dependency = function () {
return {
getMultiplier:function () {
return 10;
}
};
};
var Consumer = function (dependency) {
return {
calculateSomethingWithMultiplier:function (number) {
return number * dependency.getMultiplier();
}
};
};
it('should be correct', function () {
// given
var dependency = new Dependency();
spyOn(dependency, "getMultiplier").andReturn(40);
var consumer = new Consumer(dependency);
// when
var result = consumer.calculateSomethingWithMultiplier(3);
// then
expect(result).toEqual(120);
});
});
it("should demonstrate creating a stub that returns a value", function () {
});
describe("creating a stub that calls a fake", function () {
var Dependency = function () {
return {
request:function (callback) {
}
};
};
var Consumer = function (dependency) {
var capturedValue = "";
return {
hardAtWork:function () {
dependency.request(function (value) {
capturedValue = value;
});
},
getCapturedValue:function () {
return capturedValue;
}
};
};
it('should demonstrate creating a stub function that does something interesting', function () {
// given
var dependency = new Dependency();
spyOn(dependency, "request").andCallFake(function (callback) {
callback("Controlled return value from callback");
});
var consumer = new Consumer(dependency);
// when
consumer.hardAtWork();
// then
expect(consumer.getCapturedValue()).toEqual("Controlled return value from callback");
});
});
});