Backbone and jasmine

a playground setup with includes of backbone, jquery, underscore,...

by fguillen

HTML

<script src="http://documentcloud.github.com/underscore/underscore.js"></script>
<script src="http://documentcloud.github.com/backbone/backbone.js"></script>
<script src="https://raw.github.com/jeromegn/Backbone.localStorage/master/backbone.localStorage.js"></script>
<script src="http://sinonjs.org/releases/sinon-1.3.4.js"></script>
<html>
<head>
    <link href="http://blog.bandzarewicz.com/stylesheets/jasmine/jasmine.css" media="screen, projection" rel="stylesheet" type="text/css">

    <script src="https://raw.github.com/pivotal/jasmine/v1.1.0/lib/jasmine-core/jasmine.js"></script>
<script src="https://raw.github.com/pivotal/jasmine/v1.1.0/lib/jasmine-core/jasmine-html.js"></script>


  <title>Jasmine Spec Runner</title>
</head>

<body>
</body>
</html>

JavaScript

// code simplified and no tested

var Myapp = {};
Myapp.Models = {};
Myapp.Collections = {};
Myapp.Collections.UsersCollection = function(){};

Myapp.Models.Event = 
  Backbone.Model.extend({
    getParticipants: function(){
      var usersArray   = this.getUsersArray();
      var participants = new Myapp.Collections.UsersCollection( usersArray );

      return participants;
    },

    getUsersArray: function(){
      return this.get("participations").getUsers();
    }
  });

Myapp.Collections.ParticipationsCollection = 
  Backbone.Collection.extend({
    getUsers: function(){
      var users = 
        this.map(function(participation){
          return participation.get("user");
        });

      return users;
    }
  });


describe("Event", function() {
  beforeEach(function(){
    testModel = new Myapp.Models.Event();
  });
      
  it("getParticipants returns proper Collection", function() {
    var usersCollectionSpy = sinon.spy( Myapp.Collections, "UsersCollection" );
    
    var getUsersArrayMock = sinon.stub(testModel, "getUsersArray");
    getUsersArrayMock.returns( "usersArray" );
    
    testModel.getParticipants();
      
    expect( usersCollectionSpy.calledWith( "usersArray" ) ).toBeTruthy();
    expect( usersCollectionSpy.calledWithNew() ).toBeTruthy();
  });
});

// Jasmine spec runner
(function() {
    var jasmineEnv = jasmine.getEnv();
    jasmineEnv.updateInterval = 1000;

    var trivialReporter = new jasmine.TrivialReporter();

    jasmineEnv.addReporter(trivialReporter);

    jasmineEnv.specFilter = function(spec) {
        return trivialReporter.specFilter(spec);
    };

    var currentWindowOnload = window.onload;

    window.onload = function() {
        if (currentWindowOnload) {
            currentWindowOnload();
        }
        execJasmine();
    };

    function execJasmine() {
        jasmineEnv.execute();
        trivialReporter.outerDiv.className += ' show-passed';
    }

})();