使用Jasmine测试带有超时的JS回调

问题描述 投票:0回答:2

我需要使用Jasmine在Angular中测试一些代码,但问题是由于$ timeout调用我不能这样做。所以代码看起来像这样:

$scope.add = function() {
    SomeService.add(id, function() {
        $timeout(function() {
            $scope.showSuccessMessage();
        }, 1000)
    }, function() {})
};

所以测试代码是:

    describe('method add', function() {
    it('should add', function() {
        spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) {
            spyOn(scope, 'showSuccessMessage');
            successCallback();
            expect(scope.showSuccessMessage).toHaveBeenCalled();
        });
        scope.add();
        expect(SomeService.add).toHaveBeenCalled();
    });
});

问题是因为超时调用我无法检查是否已调用showSuccessMessage()。我知道Jasmine使用超时的能力,但在这种情况下,由于在回调中调用它,我找不到工作方式。所以这就是我需要帮助的原因。谢谢。

javascript angularjs jasmine karma-jasmine
2个回答
2
投票

你可以在调用原始函数后使用flush$timeout.flush()你的超时。这应该允许您访问successCallback

另外,我会把spyexpectshowSuccessMessage放在其他spy之外

describe('method add', function() {
    it('should add', function() {
        spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) {
            successCallback();
        });
        spyOn(scope, 'showSuccessMessage');
        scope.add();
        $timeout.flush();
        expect(SomeService.add).toHaveBeenCalled();
        expect(scope.showSuccessMessage).toHaveBeenCalled();
    });
});

1
投票

我不太熟悉角度的工作,我希望这有助于:

您可以将done函数用于异步代码:



    it('should add', function (done) {
        $scope.successCallback = function () {
            // successCallback was called
            done();
        }

        $scope.add();
    });


© www.soinside.com 2019 - 2024. All rights reserved.