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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jasmine测试带有超时的JS回调相关的知识,希望对你有一定的参考价值。

我需要使用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使用超时的能力,但在这种情况下,由于在回调中调用它,我找不到工作方式。所以这就是我需要帮助的原因。谢谢。

答案

你可以在调用原始函数后使用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();
    });
});
另一答案

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

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



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

        $scope.add();
    });


以上是关于使用Jasmine测试带有超时的JS回调的主要内容,如果未能解决你的问题,请参考以下文章

jasmine:在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调

RXjs使用jasmine进行6次回调测试

使用 Jasmine 对包含私有超时的单元测试 Angularjs 指令

使用jasmine来对js进行单元测试

Karma/Jasmine 在没有运行测试的情况下超时

使用 Jasmine 测试 Node 项目