Javascript测试框架Jasmine(一):简介
测试报告会自动追加到页尾
<script type="text/javascript">
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);
};
</script>
<script type="text/javascript">
function Song() {
}
Song.prototype.persistFavoriteStatus = function (value) {
// something complicated
throw new Error("not yet implemented");
};
</script>
<!-- include spec files here... -->
<script type="text/javascript">
beforeEach(function () {
jasmine.addMatchers({
toBePlaying: function () {
return {
compare: function (actual, expected) {
var player = actual;
return {
pass: player.currentlyPlayingSong === expected && player.isPlaying
}
}
};
}
});
});
</script>
<script type="text/javascript">
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();
}).toThrowError("song is already playing");
});
});
});
</script>