用模拟$ httpBackend测试Angular和Jasmine

时间:2016-07-12 13:36:09

标签: angularjs unit-testing

我正在尝试通过模拟$http来测试使用$httpBackend服务的方法。我的方法在我的应用程序中正常工作,但我无法让测试工作。这是不起作用的测试代码(我没有得到任何结果,并且URL是正确的:

describe("authHelper", function() {
    var webHelper;
    var url;
    var $httpBackend;

    beforeEach(function(){
        pingResponse = {
            principal: null,
            authenticated: false,
            servlet:true,
            timestamp:1468325333070
        };
        angular.mock.module('provisioning');

        inject(function ($injector) {
            webHelper = $injector.get('webHelper');
        url = webHelper.buildUrl('/ping');
            $httpBackend = $injector.get('$httpBackend');
            $httpBackend.whenGET(webHelper.buildUrl('/ping')).respond(200, pingResponse);
        });
    });

    it("should pass if setup is correct", inject(function(authHelper) {
        expect(true).toBe(true);
    console.log(url);
        authHelper.isAuthenticated().then(
        function(data){ alert(data); },
        function(data){ alert(data); }
    );
    }));

以下是我正在测试的方法 - 当我在服务器上运行我的应用服务时,这种方法有效,但模拟无效。我有10个其他测试工作正常,但似乎无法让模拟工作。我看到控制台中记录的URL,但就是这样:

var isAuthenticated = function(){
    var d = $q.defer();
    $http.get(webHelper.buildUrl('/ping')).then(function(data){
    console.log("isauth got");
    console.log(data);

        if(data.data.authenticated){
            d.resolve(true);
        } else {
            d.resolve(false);
        }
    }, function(errorData){
    console.log("Error");
    console.log(errorData);
    d.resolve(false);
});

    return d.promise;
};

1 个答案:

答案 0 :(得分:1)

在致电httpBackend.flush();后,您需要致电authHelper.isAuthenticated()来清除待处理的请求。

有关详细信息,请参阅Angular文档: https://docs.angularjs.org/api/ngMock/service/ $ httpBackend