监视闭包内的某些东西 - AngularJS Jasmine测试

时间:2014-09-08 16:20:10

标签: javascript angularjs unit-testing jasmine

我有一个简单的例子,我无法解决。虽然这个例子很简单,但我想知道如何使用Jasmine单元测试监视这个$ log.error。我相信闭包是问题,即使我在嘲笑$ log并且它会起作用它不在服务的闭包中。以下是Angular服务和测试的代码。任何人都知道如何监视封闭内部的东西?:

Angular Code:

afloatApp.service("WebConfigSettingsService", ['$http', '$q', '$log', function ($http, $q, $log) {    
    var getConfigSettings = function () {
        var deferred = $q.defer();

        $http({
            method: 'GET',
            url: '/api/SOMEPATH'
        }).success(function (data, status, headers, config) {
            deferred.resolve(data);
        }).error(function (data, status, headers, config) {
            //THIS IS THE $LOG.ERROR test
            $log.error("Error loading WebConfigSettings");
            deferred.reject(data);
        });

        return deferred.promise;
    };


    var webConfigSettings = getConfigSettings().then(function(data) {
            return {
                classification: angular.lowercase(data.Classification),
                environment: angular.lowercase(data.Environment)
            };
    });

    return webConfigSettings;
}]);

失败的茉莉花测试

describe('WebConfigSettingsService', function () {
    var webConfigSettingsService, $httpBackend, mockLog, $q, 
        urlExpected = "/api/SOMEPATH",
        serverData = {
            Classification: 'unclassified',
            Environment: 'development'
        };

    beforeEach(module("myApp"));
    beforeEach(inject(function (_$httpBackend_, _$log_, _$q_, _WebConfigSettingsService_) {
        webConfigSettingsService = _WebConfigSettingsService_;
        $httpBackend = _$httpBackend_;
        mockLog = _$log_;
        spyOn(mockLog, 'error');
        $q = _$q_;
        $httpBackend.expectGET(urlExpected);
    }));

    afterEach(function () {
        $httpBackend.flush();
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });

    it("should log error when http errors out", function () {
        $httpBackend.whenGET("/api/SOMEPATH").respond(500, "Random Error");
        //THIS FAILS.  Note that mockLog.error spy is set in before each
        expect(mockLog.error).toHaveBeenCalled();
    });
});

1 个答案:

答案 0 :(得分:1)

你没有在测试中冲洗后端。

it("should log error when http errors out", function () {
    $httpBackend.whenGET(urlExpected).respond(500, "Random Error");
    $httpBackend.flush();
    expect(mockLog.error).toHaveBeenCalled();
});

当你添加它时,你会从afterEach中的flush中得到一个错误,因为不应该有任何东西要冲洗,取出它。 此外,这会导致您的verifyNoOutstandingRequest始终通过。

beforeEach中的expectGET是什么?似乎不需要它。

顺便说一下,$ log已经被角度模拟嘲笑了,看看这里有更多细节: https://docs.angularjs.org/api/ngMock/service/ $日志

你可以带走间谍并做到这一点:

it("should log error when http errors out", function () {
    $httpBackend.whenGET(urlExpected).respond(500, "Random Error");
    $httpBackend.flush();
    expect(mockLog.error.logs).toContain(["Error loading WebConfigSettings"]);
});