Mocking injected dependencies - aca-mobile/ti-unit GitHub Wiki

Suppose you want to test a controller, which depends on a library, eg.:

var UserManager = require('user.manager');

function onButtonClick() {
    UserManager.setUserName($.username.getValue());
}

module.exports = {
   test: {
     onButtonClick: onButtonClick
   }
}

You don't want to depend on the real user.manager implementation. Instead you want to create a mock so you have full control over the user.manager.

Define MockRequire and add a mock in the beforeEach function

MockRequire = require('tiunit/mockrequire');

var USER_NAME = "John Doe";

var userManagerMock = {
   setUserName: function(){}
};

$ = {
  username: {
     getValue: function(){}
  }
};

beforeEach(function () {
   MockRequire.addMock('user.manager', userManagerMock);
   controllerUnderTest = require('../app/controllers/authenticate');
});

afterEach(function(){
   MockRequire.resetMocks();
});

it('should set the user name on the UserManager whenever the button is clicked', function(){
    spyOn(userManagerMock, 'setUserName');
    spyOn($.username, 'getValue').and.returnValue(USER_NAME);

    controllerUnderTest.test.onButtonClick();

   expect(userManagerMock.setUserName).toHaveBeenCalledWith(USER_NAME);
});