2015-07-09 2 views
2

У меня есть контроллер, который имеет только частные функции. Я пытаюсь проверить этот контроллер. Должен ли я проверить, работает ли он $ emit, так как ImageService был протестирован? Как я могу проверить $ emit в этом случае? Или я должен проверить, вызвал ли он метод ImageService.fetchImageStacks? В этом случае, как мне инициировать функцию init?Единичный контрольный контроллер AngularJS с только частными функциями

(function (angular, global, undefined) { 
'use strict'; 

var ImageController = {}; 

ImageController.$inject = [ 
    '$rootScope', 
    '$log', 
    'ImageService' 
]; 

ImageController = function (
    $rootScope, 
    $log, 
    ImageService 
) { 

    var getImageStacks = function() { 
     ImageService 
      .fetchImageStacks() 
      .success(function (result) { 
       ImageService.setImageStacks(result); 
       $rootScope.$emit('rootScope:imageStacksUpdated', result); 
      }) 
      .error(function(){ 
       $log.error('Failed to get imageStackInfo file.'); 
      }); 
    }; 

    var init = function() { 
     getImageStacks(); 
    }; 

    init(); 

    return { 
     getImageStacks: getImageStacks 
    }; 
} 

angular.module('myApp') 
    .controller('ImageController', ImageController); 

})(angular, this); 

ответ

1

Вы не должны испытывать частные/внутренние методы, которые не доступны для внешнего мира (IMHO).

Некоторые ресурсы по этой теме (для & против):


С учетом этого вы подвергаете getImageStacks контроллеру - так что это не частный метод. Если вы должны были выйти результат экземпляра контроллера в вашем наборе тестов, вы должны увидеть что-то в этом роде:

{ getImageStacks: function }

(init() в вашем случае, это всего лишь псевдоним для getImageStacks (он же там нет необходимости в методе init - вы можете просто позвонить getImageStacks и сделать с ним)).

В любом случае, чтобы написать несколько тестов;

Прежде, вы должны stub вне ImageService как мы не заинтересованы во внутренней реализации указанной службы, мы только когда-либо заинтересованы в общении, идущем от контроллера к услуге. Отличная библиотека для stubbing/mocking/spying - sinonjs - получите, вы не пожалеете.

В beforeEach я хотел бы предложить вам сделать что-то вроде этого:

// Stub out the ImageService 
var ImageService = { 
    fetchImageStacks: sinon.stub(), 
    setImageStacks: sinon.stub() 
}; 

var $scope, instantiateController; 

beforeEach(function() { 
    // Override the ImageService residing in 'your_module_name' 
    module('your_module_name', function ($provide) { 
    $provide.value('ImageService', ImageService); 
    }); 

    // Setup a method for instantiating your controller on a per-spec basis. 
    instantiateController = inject(function ($rootScope, $controller, $injector) { 
    ctrl = $controller('ImageController', { 
     $scope: $rootScope.$new(), 
     // Inject the stubbed out ImageService. 
     ImageService: $injector.get('ImageService') 
    }); 
    }); 
}); 

Теперь у вас есть затушил ImageService для проверки вызовов против, и метод для создания экземпляра контроллера с зависимостями, передаваемых в него.

Некоторые примеры, которые вы можете запустить;

it('calls the ImageService.fetchImageStacks method on init', function() { 
    instantiateController(); 
    expect(ImageService.fetchImageStacks).to.have.been.calledOnce; 
}); 

it('calls the ImageService.setImageStacks on success', inject(function ($q, $timeout) { 
    ImageService.getImageStacks.returns($q.when('value')); 
    instantiateController(); 
    $timeout.flush(); 
    expect(ImageService.setImageStacks).to.have.been.calledOnce.and.calledWith('value'); 
})); 

Надеюсь, этого хватит и ответит на ваши вопросы;

  • Если вы должны/не должны проверять внутреннюю реализацию.
  • Как проверить инициализацию контроллера.
  • Как проверить методы инжектируемой службы.
+0

Было очень полезно решить мои проблемы. – Tsolmon

+0

Я рад, что смогу помочь! –

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