簡體   English   中英

監視閉包內部的內容-AngularJS Jasmine測試

[英]Spying on something inside a closure - AngularJS Jasmine testing

我有一個無法解決的簡單示例。 雖然這個例子很簡單,但我想知道如何使用Jasmine單元測試來監視$ log.error。 我相信關閉是個問題,即使我嘲笑$ log,它也會起作用,因為它不在服務的關閉中。 以下是Angular服務和測試的代碼。 有誰知道如何監視閉包內部的內容?:

角度代碼:

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();
    });
});

您沒有在測試中刷新后端。

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

當您添加它時,您將在afterEach中從刷新中得到一個錯誤,因為不應該剩下任何要刷新的內容,請將其取出。 此外,這將導致您的verifyNoOutstandingRequest始終通過。

beforeEach中的期望值是什么? 似乎不需要。

順便說一句,$ log已經被angular-mocks嘲笑了,在這里看看更多細節: https : //docs.angularjs.org/api/ngMock/service/ $ log

您可以刪除間諜並執行以下操作:

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"]);
});

暫無
暫無

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

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