2013-10-07 2 views
0

У меня есть AngularJS контроллер так:

 app.controller('MyCtrl', function($scope, myFactory){ 
      $scope.types = myFactory.getTypes();  
      $scope.model= {};  
      $scope.model.type = $scope.types[0].type; 

    }); 
}); 

Все отлично работает.

Но я хочу протестировать этот контроллер в жасмине. Так я издеваться myFactory и инициализации myCtrl подобное:

describe('Controllers: MyCtrl', function() { 

     var MyCtrl, mockedFactory, scope; 

     beforeEach(module('app.factories', function ($provide) { 
      mockedFactory = { 
       getTypes: function(){} 
      }; 

      spyOn(mockedFactory, 'getTypes'); 
      $provide.value('myFactory', mockedFactory); 
     })); 

     beforeEach(module('app')); 

     beforeEach(inject(function ($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      MyCtrl= $controller('MyCtrl', { 
       $scope: scope 
      }); 
     })); 

     it('should call AccordTypeFactory.getAvailableTypes()', function() { 
      scope.types; 
      expect(mockedFactory.getTypes).toHaveBeenCalled(); 
     }); 

Но у меня есть логическая ошибка: Cannot read property 0 of undefined

Я понимаю эту ошибку; потому что я высмеиваю заводское свойство своего контроллера $scope.model.type, это не определено, потому что оно использует результат фабрики через $scope.types.

Мой вопрос прост: как я могу сделать работу своим тестом?

Thx ребята

ответ

0

Я нашел лучшее решение и я думаю.

Это реали я только что добавить функцию andReturn после spyOn:

spyOn(mockedFactory, 'getTypes').andReturn([{type: 'MockType'}]); 
1
beforeEach(module('app.factories', function ($provide) { 
     mockedFactory = { 
      getTypes: function(){ return [{}]; } 
     }; 

     spyOn(mockedFactory, 'getTypes').andCallThrough(); 
     $provide.value('myFactory', mockedFactory); 
    })); 

Если я вас правильно понял, ваша проблема в том, что макет не возвращает массив в то время как контроллер ожидает, что там всегда будет по крайней мере один элемент. Вы можете настроить макет, чтобы вернуть массив с элементом, а затем использовать andCallThrough() на шпионах, чтобы он на самом деле называл макет.

Если это возможно, что ваш завод может вернуться пустые массивы в то время как приложение работает, вы, вероятно, хотите, чтобы проверить, что массив содержит, по меньшей мере, один элемент, прежде чем пытаться получить доступ к types[0]

Смежные вопросы