茉莉花:在茉莉花指定的超时内未调用异步回调。DEFAULT_TIMEOUT_INTERVAL

我有一个角度服务,叫做:requestNotificationChannel

app.factory("requestNotificationChannel", function($rootScope) {

    var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";

    function deleteMessage(id, index) {
        $rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
    };

    return {
       deleteMessage: deleteMessage
    };

});

我正在尝试使用茉莉花对这项服务进行单元测试:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope, scope;

    beforeEach(function(_requestNotificationChannel_) {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            scope = rootScope.$new();
            requestNotificationChannel = _requestNotificationChannel_;
        })

        spyOn(rootScope, '$broadcast');
    });


    it("should broadcast delete message notification", function(done) {

        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
        done();       
    });
});

我读过Jasmine中的异步支持,但由于我对javascript的单元测试相当陌生,因此无法使其正常工作。

我收到一个错误:

Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

我的测试执行时间太长(大约5秒)。

有人可以帮我提供代码的工作示例和一些解释吗?


答案 1

在函数中具有参数(在下面的代码中)将导致 Jasmine 尝试异步调用。itdone

//this block signature will trigger async behavior.
it("should work", function(done){
  //...
});

//this block signature will run synchronously
it("should work", function(){
  //...
});

参数的名称没有区别,它的存在才是最重要的。我从太多的复制/意大利面中遇到了这个问题。done

Jasmine 异步支持文档指出,参数(如上所示)是一个回调,可以调用它来让 Jasmine 知道异步函数何时完成。如果你从不调用它,Jasmine将永远不会知道你的测试已经完成,最终会超时。done


答案 2

即使对于异步测试,在这种情况下也会有一个超时关闭,您可以通过增加限制超时的值来评估异步 Jasmine 回调来解决此错误

describe('Helper', function () {
    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000;
    });

    afterEach(function() {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });

    it('Template advance', function(doneFn) {
        $.ajax({
            url: 'public/your-end-point.mock.json',
            dataType: 'json',
            success: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            },
            error: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            }
        });
    });
});

资料来源:http://jasmine.github.io/2.0/introduction.html#section-42