私のapp.jsでカスタムプロバイダを使用して、バックエンドコールを行い、コントローラにそのプロバイダを注入して約束の結果を得るだけです(getLoggedUserをすべてのコントローラ私はちょうどプロバイダからの結果を取得している)と10コールを行う代わりに、私はプロバイダーでただ1つを作成します)。しかし、このプロバイダ$ getメソッドをテストすることができず、バックエンドコールが決して行われないため、テストに失敗しています。
私は取得していますエラー:
Error: Unexpected request: GET https://localhost:8443/user/current
がapp.js
angular.module('app', [
...
])
.config(config)
.run(run)
.controller('MainCtrl', MainCtrl)
.value('version', '1.1.0')
.provider('userProvider', function(){
this.$get = ['AuthenticationService',
function(AuthenticationService) {
return AuthenticationService.getLoggedUser();
}];
});
TEST
/* jshint undef:false*/
(function() {
'use strict';
describe('ListingController', function() {
var listingController, rootScope, scope, q, mockAuthenticationService, $httpBackend, service;
var provider = {};
var mockCurrentUser = {
id: 1782,
name: "One, Coordinator",
roleId: [
3, 10
],
eauthId: "coodinator1"
};
beforeEach(module('app'));
beforeEach(module('listing'));
beforeEach(function() {
module(function (userProviderProvider) {
provider = userProviderProvider;
});
});
beforeEach(inject(function($rootScope, $controller, $q, _$httpBackend_, _AuthenticationService_, userProvider, $injector) {
rootScope = $rootScope;
scope = rootScope.$new();
$httpBackend = _$httpBackend_;
q = $q;
mockAuthenticationService = _AuthenticationService_;
// provider = userProvider;
service = $injector.invoke(provider.$get);
rootScope.$digest();
listingController = $controller('ListingController', {
$scope : scope,
mockAuthenticationService : _AuthenticationService_
});
}));
describe('getLogged user and init',function(){
it("should call getLogged function", function() {
listingController.getLoggedUser();
rootScope.$digest();
expect(service).toHaveBeenCalled();
});
});
});
})();
コントローラ
function getLoggedUser() {
userProvider.then(function (data){
// Here I am getting result from back end call from provider which is good
});
私は、プロバイダでこのようなものを作る場合:
this.$get = function (AuthenticationService) {
return {
loggedUser : function() {
return AuthenticationService.getLoggedUser();
}
}
}
私は、テスト中にこのような何かを行うことができますが、と、
spyOn(provider , 'loggedUser').and.callFake(function() {
var deferred = q.defer();
deferred.resolve(mockCurrentUser);
return deferred.promise;
});
と、これはテストに合格します動作します私がuserProvider.loggedUser()を使用したときに、すべてのコントロールでこのアプローチを使用すると、追加のバックエンド呼び出しが行われ、上記の場合はバックエンド呼び出しが1回だけ行われます。セイラン
ため
アップデート私はあなたがサービスを呼び出し、方法で他のサービスの追加の呼び出しからgetLoggedUserを呼び出すことをお勧めしますようにした場合、私は機能せずに持っているだけではなく、いずれかのよう...毎回行われています。
.provider('userProvider', function(){
return {
$get: function(AuthenticationService) {
return new userService(AuthenticationService);
}
}
});
サービス
function userService(AuthenticationService) {
this.getLoggedUser = function() {
return AuthenticationService.getLoggedUser();
}
}
$ httpBackend –
@CeylanMumunKocabaşで予想されるURL要求を定義し、私はそれに追加するには、機能: それ( "getLogged関数を呼び出す必要があります"、機能(){ listingController.getLoggedUser(); $ httpBackend.expectGET( 'https://ではlocalhost:8443 /ユーザー/現在').respond(200); $ httpBackend.flush(); }); もう一度同じエラーが発生します... – Bukic
$ httpBackend.when( 'GET'、 'localhost:8443/user/current')。respond(200); $ httpBackend.expect( 'GET'、 'localhost:8443/user/current'); ' –