【问题标题】:Is it possible to use spyOn on a method of an injected service?是否可以在注入服务的方法上使用 spyOn?
【发布时间】:2014-08-04 19:45:11
【问题描述】:

我正在为 Jasmine 中的控制器编写测试;控制器依赖于我使用beforeEach(inject) 注入的服务。但是,当我尝试监视服务中的方法时,总是会收到以下错误:

spyOn could not find an object to spy upon for replacePod()

我的测试代码如下:

describe('Controller: ResultsController', function () {
    'use strict';
    var ctrl;
    var ResultsService;
    var RouteService;
    var PodService;
    var $scope;
    var httpMock;
    var log;
    // load the controller's module
    beforeEach(module('waApp'));·
    // Initialize the controller and a mock scope
    ····
    beforeEach(inject(function(
            $rootScope,
            $log,
            $controller,
            $httpBackend,
            ResultsService,
            RouteService,
            PodService
        ) {
            $scope =  $rootScope.$new();
            log = $log;
            log.reset();
            httpMock = $httpBackend;
            ctrl = $controller('ResultsController', {
                $scope: $scope,
                ResultsService: ResultsService,
                RouteService: RouteService,
                PodService: PodService
            });
    }));

    it('processRecalculate should call PodService.replacePod', function() {
        $scope.getResults({input:'kitten'});
        spyOn(PodService, 'replacePod');
        expect(PodService.replacePod).toHaveBeenCalled();
    });

这会产生上述错误。我的代码有问题,还是无法监视注入服务中的方法?

【问题讨论】:

    标签: javascript angularjs jasmine


    【解决方案1】:

    您不会将注入的服务分配给外部变量。因此,当窥探它时它是未定义的。

    inject 中的代码应如下所示:

    beforeEach(inject(function(
      $rootScope,
      $log,
      $controller,
      $httpBackend,
      _ResultsService_,
      _RouteService_,
      _PodService_
    ) { 
      $scope = $rootScope.$new();
      log = $log;
      log.reset();
      httpMock = $httpBackend;
      ResultsService = _ResultsService_;
      RouteService = _RouteService_;
      PodService = _PodService_;
      ctrl = $controller('ResultsController', {
        $scope: $scope,
        ResultsService: ResultsService,
        RouteService: RouteService,
        PodService: PodService
      });
    }));
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      是的,确实可以监视注入服务中的方法。

      我在下面(在 coffeescript 中)粘贴了一个完整的工作示例 jasmine.spec,因此您可以看到各种实际使用的语法示例。

      describe 'AppService', ->
      
          beforeEach ->
              module 'amorphosite'
      
          beforeEach inject ($injector) ->
              @rootScope = $injector.get '$rootScope'
              @appService = $injector.get 'appService'
              @userService = $injector.get 'userService'
              @restoreService = $injector.get 'restoreService'
              @transitionService = $injector.get 'transitionService'
              @scope = @rootScope.$new()
      
          describe 'setRootWatch', ->
              describe 'when $stateChangeStart event is triggered and the user is null', ->
                  beforeEach ->
                      @appService.setRootWatch @scope
      
                  describe 'and the user cannot be restored', ->
                      beforeEach ->
                          spyOn(@userService, 'userIsNull').andReturn true
                          spyOn(@restoreService, 'canRestore').andReturn false
                          spyOn @transitionService, 'gotoLogin'
      
                      it 'it should transition to the login state', ->
                          @scope.$broadcast '$stateChangeStart', {name:'[protected-state]'}
                          expect(@transitionService.gotoLogin).toHaveBeenCalled()
      
                  describe 'and the user can be restored', ->
                      beforeEach ->
                          spyOn(@userService, 'userIsNull').andReturn true
                          spyOn(@restoreService, 'canRestore').andReturn true
                          spyOn @restoreService, 'restore'
      
                      it 'it should restore the available data', ->
                          @scope.$broadcast '$stateChangeStart', {name:'[protected-state]'}
                          expect(@restoreService.restore).toHaveBeenCalled()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2017-10-25
        • 1970-01-01
        相关资源
        最近更新 更多