2016-12-14 5 views
0

私は亡くなりました。偽のログイン後にApiServiceMockが約束を解決した後にstate.goが呼び出されたかどうかを試してみます。
Expected spy go to have been called.AngularJS 1.xカルマによるコンポーネントテストは、成功関数(spyOn)のテストを約束します。

私は直接それが動作state.goトリガされた別の関数をテストする場合:私は得るこのテストのために
。だから私は約束が最初に解決されていないと思います。

角度コンポーネントを使用すると、テストは私には新しくなりました。誰かが私に間違っていることのヒントを教えてもらうことができれば、あるいは全体のアプローチが最初から間違っているかどうかを私に知らせてもいいでしょう。

login.component.ctrl.js

module.exports = function LoginComponentCtrl($state, $log, apiService) { 
    var vm = this; 

    vm.submit = function() { 
     apiService 
     .login(vm.username, vm.password) 
      .then(function(response) { 
      $state.go('storeDetail'); 
      }) 
      .catch(function(errData) { 
      $log.error(errData); 
      }); 
    }; 
    }; 

login.spec.js

var app = require('../../app.js'); 
var login = require('./login.module.js'); 

describe('login', function() { 

    var controller; 
    var element; 
    var scope; 
    var state; 
    var ApiServiceMock; 
    var StateMock; 
    var deferred; 

    beforeEach(angular.mock.module(app)); 
    beforeEach(angular.mock.module(login)); 

    describe('Component: login', function() { 

    beforeEach(inject(function($rootScope, $compile, $componentController, $q){ 
     deferred = $q.defer(); 

     ApiServiceMock = { 
     login: function() { 
      return deferred.promise; 
     } 
     }; 

     StateMock = { 
     go: function() { 
      return true; 
     } 
     }; 

     scope = $rootScope.$new(); 
     controller = $componentController('login', { 
     $scope: scope, 
     apiService: ApiServiceMock, 
     $state: StateMock 
     }); 
     element = angular.element('<login></login>'); 
     element = $compile(element)(scope); 
     scope.$apply(); 
    })); 

    it('on successful login', function() { 
     controller.username = 'Michael Jackson'; 
     controller.password = 'dangerous123'; 

     spyOn(StateMock, 'go').and.callThrough(); 

     controller.submit(); 

     deferred.resolve(); 
     scope.$digest(); 

     expect(StateMock.go).toHaveBeenCalled(); 
    });); 
    }); 
}); 

私はこれをより明確にするために、さらに情報を追加することができるなら、私に教えてください。

答えて

1

あなたのモックサービスから解決された約束を直接返すだけです。

は、私は `deferred.resolve()`の中に `` {}逃したことを確認するために私を助けたこの

beforeEach(inject(function($rootScope, $compile, $componentController, $q){ 
    ApiServiceMock = { 
    login: function() { 
     return $q.resolve({}); // if angular version is 1.4+ 
    //return $q.when({}); // if angular less than 1.4 
    } 
    }; 

    StateMock = { 
    go: function() { 
     return true; 
    } 
    }; 

    scope = $rootScope.$new(); 
    controller = $componentController('login', { 
    $scope: scope, 
    apiService: ApiServiceMock, 
    $state: StateMock 
    }); 
    element = angular.element('<login></login>'); 
    element = $compile(element)(scope); 
    scope.$apply(); 
})); 

it('on successful login', function() { 
    controller.username = 'Michael Jackson'; 
    controller.password = 'dangerous123'; 

    spyOn(StateMock, 'go').and.callThrough(); 

    controller.submit(); 

    scope.$digest(); 

    expect(StateMock.go).toHaveBeenCalled(); 
}); 
); 
+0

Thxを@Jayを、試してみてください。これは 'it'の中でも動作します。 解決策は次のとおりです。 'deferred.resolve({});' – escapedcat

関連する問題