簡體   English   中英

茉莉花單元測試中未調用提供者$ get方法

[英]Provider $get method is not called in jasmine unit test

我在app.js中使用自定義提供程序進行后端調用,然后在控制器中注入該提供程序並獲得承諾結果(之所以這樣做,是因為在每個控制器中調用getLoggedUser只是從提供程序中獲取結果),而不是例如,如果有10個電話,我將僅在提供者中撥打一個)。 但是我無法測試此提供程序$ 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();
                }];
        });

測試

/* 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()時,在每個控件中使用此方法。然后它將進行額外的后端調用,並且只有一次以上的后端調用。

塞蘭更新

如果我確實喜歡您建議調用服務,並且在方法調用中從另一項服務調用getLoggedUser,則每次都會進行其他調用……不只是像我沒有功能那樣。

.provider('userProvider', function(){
            return {
                $get: function(AuthenticationService) {
                    return new userService(AuthenticationService);
                }
            }
        });

服務

   function userService(AuthenticationService) {
        this.getLoggedUser  = function() {
           return  AuthenticationService.getLoggedUser();
        }
    }

基本結構如下:

$httpBackend.when('GET', 'localhost:8443/user/current').respond(200, /*optional response callback function*/); 
$httpBackend.expect('GET', 'localhost:8443/user/current');

//here goes the function that makes the actual http request

$httpBackend.flush();

確保定義了httpBackend var- var httpBackend = $httpBackend;

並且為了檢查服務是否被調用,您必須使用間諜。

spyOn(service, 'method').and.callThrough();

//here goes the function that calls the service

expect(service.method).toHaveBeenCalled();

您將上面的兩個模塊結合在一起,就可以實現所需的功能。

describe('something',function(){
            it("should do something", function() {

                spyOn(service, 'method').and.callThrough();

                $httpBackend.when('GET', 'localhost:8443/user/current').respond(200,/*optional response callback function*/); 
                $httpBackend.expect('GET', 'localhost:8443/user/current');

                //call the function that makes http request and calls your service

                rootScope.$digest();
                $httpBackend.flush();

                expect(service.method).toHaveBeenCalled();
            });
        });

關於您的服務:

function myService(){
    var svc = this;

    svc.myMethod = function(){
         return someDataOrPromise;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM