Testing JavaScript using JASMINE
What is Jasmine?
- 
	Jasmine is a behavior-driven development (BDD) framework for testing JS code 
- 
	It does not depend on any other JS frameworks 
- 
	It does not require a DOM 
- 
	It has a clean, obvious syntax 
describe("A suite", function() {
  it("contains spec with an expectation", function() {
    expect(true).toBe(true);
  });
});Suites: describe your code
A test suite begins with a call to the global Jasmine function describe with two parameters: a string and a function.
- The string is a name or title for a test suite – usually what is being tested.
- The function is a block of code that implements the suite.
Suites: describe your code
// This is a suite
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);
  });
});
Suites: Nesting describe Blocks
Calls to describe can be nested, with specs defined at any level. This allows a suite to be composed as a tree of functions
// This is a suite
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);
  });
  
  // This is a suite inside a suite 
  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();
    });
    it("should be possible to resume", function() {
      player.resume();
      expect(player.isPlaying).toBeTruthy();
      expect(player.currentlyPlayingSong).toEqual(song);
    });
  });
});
Specs
Specs are defined by calling the global Jasmine function it, which, like describe takes a string and a function.
- 
The string is the title of the spec and the function is the spec, or test. 
	- A spec contains one or more expectations that test the state of the code.
- A spec with all true expectations is a passing spec.
- A spec with one or more false expectations is a failing spec.
 
Specs
describe("Player", function() {
  var player;
  var song;
  beforeEach(function() {
    player = new Player();
    song = new Song();
  });
  // this is a spec
  it("should be able to play a Song", function() {
    player.play(song);
    expect(player.currentlyPlayingSong).toEqual(song);
  });
});
Specs: before and after
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);
  });
  afterEach(function(){
    player = null;
    song = null;
  });
});
beforeEach() -> takes a function that is executed before each spec
afterEach() -> takes a function that is executed after each spec
Expectations & Matchers
Expectation
- 
	assertion that is either true or false 
- 
	built with the function expect which takes a value, called the actual. 
- 
	it is chained with a Matcher function, which takes the expected value. 
Matcher
- used to evaluate the behavior of your code
- implements a boolean comparison between the actual value and the expected value.
- responsible for reporting to Jasmine if the expectation is true or false. Jasmine will then pass or fail the spec
Expectations & Matchers
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);
    
    // expectation and matcher
    expect(player.currentlyPlayingSong).toEqual(song);
  });
});
Custom Matcher
describe("Player", function() {
  var player;
  var song;
  beforeEach(function() {
    player = new Player();
    song = new Song();
    jasmine.addMatchers({
        toBePlaying: function () {
          return {
            compare: function (actual, expected) {
              var player = actual;
    
              return {
                pass: player.currentlyPlayingSong === expected && player.isPlaying
              };
            }
          };
        }
      });  
  });
  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);
  });
});Spies
Text
deck
By pgamilde
deck
- 911
 
   
   
  