2016-01-19 7 views
0

Я использую Karma, Jasmine и Sinon для тестирования приложения AngularJs. Контроллер имеет введенную службу, и я хочу использовать песочницу Sinon, чтобы заглушить метод службы. Вот контроллер:Sinon stub on AngularJs сервис не работает как ожидается

(function() { 
    'use strict'; 

    angular.module('app').controller('myController', myController); 

    myController.$inject = ['$scope', 'myService']; 

    function myController($scope, myService) { 

     $scope.methodTestResult = myService.testMethod(); 
    } 
}()); 

А вот проверочный файл:

(function() { 
    'use strict'; 

    beforeEach(module('app')); 

    describe('myController', function() { 

     var $scope, myService; 

     beforeEach(inject(function ($controller, $rootScope, _myService_) { 
      $scope = $rootScope.$new(); 

      myService = _myService_; 

      $controller('myController', { $scope: $scope }); 

      sandbox = sinon.sandbox.create(); 

     })); 

     afterEach(function() { 
      sandbox.restore(); 
     }); 

     describe('methodTestResult', function() { 

      beforeEach(function() { 
       sandbox.stub(myService, 'testMethod'); 
      }); 

      it('invokes the testMethod', function() { 
       expect(myService.testMethod).toHaveBeenCalled(); 
      }); 
     }); 
    }); 

}()); 

FWIW, вот служба завода:

(function() { 
    'use strict'; 

    angular.module('app').factory('myService', myService); 

    function myService() { 
     return { 
      testMethod: function() { 
       return true; 
      } 
     }; 
    } 
}()); 

Когда я запускаю тест он терпит неудачу и говорит :

Ожидаемый шпион «testMethod», светодиод. «testMethod» был вызван 0 раз.

Жутко, если добавить тестовое свойство к услуге внутри тестового файла, например:

myService.testProperty = 'test'; 

А затем войти на это внутри контроллера испытывается:

console.log(myService.testProperty); 

Это работает как ожидалось, и я вижу новое свойство, добавленное в тестовый файл внутри контроллера. У меня есть синус, указанный в качестве каркаса в моей конфигурации кармы, никаких ошибок в отношении недостающих зависимостей не возникает. Вот пакеты Я установил:

"grunt": "^0.4.5" 
"grunt-karma": "^0.12.1", 
"jasmine-core": "^2.4.1", 
"jasmine-sinon": "^0.4.0", 
"karma": "^0.13.19", 
"karma-jasmine": "^0.3.6", 
"karma-phantomjs-launcher": "^0.2.3", 
"karma-sinon": "^1.0.4", 
"phantomjs": "^1.9.19", 
"sinon": "^1.17.2" 

Я использовал эту же комбинацию AngularJs/Карма/Жасмин/Sinon до и все работает, как ожидалось. Непонятно, почему заглушка не называется?

ответ

1

На данный момент

 $controller('myController', { $scope: $scope }); 

функции конструктора '' myController уже называли, и поэтому оригинальный myService.testMethod метод. Решение состоит в том, чтобы закрыть его до создания экземпляра контроллера.

+0

Спасибо, я попробую изменить заказ – danwellman

+0

yep, который сделал это, спасибо – danwellman