Commit 0cf67e92
Changed files (4)
spec
javascripts
helpers
jasmine_examples
app/assets/javascripts/jasmine_examples/Player.js
@@ -0,0 +1,22 @@
+function Player() {
+}
+Player.prototype.play = function(song) {
+ this.currentlyPlayingSong = song;
+ this.isPlaying = true;
+};
+
+Player.prototype.pause = function() {
+ this.isPlaying = false;
+};
+
+Player.prototype.resume = function() {
+ if (this.isPlaying) {
+ throw new Error("song is already playing");
+ }
+
+ this.isPlaying = true;
+};
+
+Player.prototype.makeFavorite = function() {
+ this.currentlyPlayingSong.persistFavoriteStatus(true);
+};
\ No newline at end of file
app/assets/javascripts/jasmine_examples/Song.js
@@ -0,0 +1,7 @@
+function Song() {
+}
+
+Song.prototype.persistFavoriteStatus = function(value) {
+ // something complicated
+ throw new Error("not yet implemented");
+};
\ No newline at end of file
spec/javascripts/helpers/SpecHelper.js
@@ -0,0 +1,9 @@
+beforeEach(function() {
+ this.addMatchers({
+ toBePlaying: function(expectedSong) {
+ var player = this.actual;
+ return player.currentlyPlayingSong === expectedSong
+ && player.isPlaying;
+ }
+ })
+});
spec/javascripts/jasmine_examples/PlayerSpec.js
@@ -0,0 +1,58 @@
+describe("Player", function() {
+ var player;
+ var song;
+
+ beforeEach(function() {
+ player = new Player();
+ song = new Song();
+ });
+
+ it("should be able to play a Song", function() {
+ player.play(song);
+ expect(player.currentlyPlayingSong).toEqual(song);
+
+ //demonstrates use of custom matcher
+ expect(player).toBePlaying(song);
+ });
+
+ describe("when song has been paused", function() {
+ beforeEach(function() {
+ player.play(song);
+ player.pause();
+ });
+
+ it("should indicate that the song is currently paused", function() {
+ expect(player.isPlaying).toBeFalsy();
+
+ // demonstrates use of 'not' with a custom matcher
+ expect(player).not.toBePlaying(song);
+ });
+
+ it("should be possible to resume", function() {
+ player.resume();
+ expect(player.isPlaying).toBeTruthy();
+ expect(player.currentlyPlayingSong).toEqual(song);
+ });
+ });
+
+ // demonstrates use of spies to intercept and test method calls
+ it("tells the current song if the user has made it a favorite", function() {
+ spyOn(song, 'persistFavoriteStatus');
+
+ player.play(song);
+ player.makeFavorite();
+
+ expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
+ });
+
+ //demonstrates use of expected exceptions
+ describe("#resume", function() {
+ it("should throw an exception if song is already playing", function() {
+ player.play(song);
+
+ expect(function() {
+ player.resume();
+ }).toThrow("song is already playing");
+ });
+ });
+});
\ No newline at end of file