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