jasmine:asynchronouscallback未在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时

我有一个叫做requestNotificationChannel的angular度服务:

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

我正在尝试使用jasmineunit testing此服务:

 "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中的asynchronous支持,但是因为我对JavaScript的unit testing颇为陌生,所以无法使其工作。

我收到一个错误:

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

我的testing花了太长时间才能执行(大约5秒)。

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

在你的函数中有一个参数会导致它尝试一个asynchronous调用。

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

done论证被命名并不重要,它的存在就是最重要的。 我从太多的复制/面食遇到了这个问题。

Jasmin asynchronous支持文档注意到,参数(名为done以上)是一个callback函数,可以调用它让Jasmine知道asynchronous函数何时完成。 如果你从来没有打过电话,茉莉花永远不会知道你的testing已经完成,并最终超时。

您需要增加限制超时来评估同步茉莉花callback

 describe('Helper', function () { var originalTimeout; beforeEach(function() { originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; }); afterEach(function() { jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; }); it('template advance', function(doneFn) { $.ajax({ url: 'public/gustavo-salgado.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

这个错误也可能是由于在初始化一个服务/工厂或者其他方面的时候遗漏注入造成的。 例如,可以这样做:

  var service; beforeEach(function(_TestService_) { service = _TestService_; }); 

要修复它只是包装与注入function正确检索服务:

  var service; beforeEach(inject(function(_TestService_) { service = _TestService_; })); 

删除scope引用和函数参数后工作:

  "use strict"; describe("Request Notification Channel", function() { var requestNotificationChannel, rootScope; beforeEach(function() { module("messageAppModule"); inject(function($injector, _requestNotificationChannel_) { rootScope = $injector.get("$rootScope"); requestNotificationChannel = _requestNotificationChannel_; }) spyOn(rootScope, "$broadcast"); }); it("should broadcast delete message notification with provided params", function() { requestNotificationChannel.deleteMessage(1, 4); expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} ); }); }); 

这个错误对我来说是一个蓝色,一直在运行。 直到我注意到我的Macbook运行缓慢,我找不到任何帮助。 我注意到CPU被另一个进程挂钩,我杀了。 茉莉花的asynchronous错误消失了,我的testing再次罚款。

不要问我为什么,我不知道。 但在我的情况下,似乎缺乏系统资源的过错。

 it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) { requestNotificationChannel.deleteMessage(1, 4); expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 }); // done(); -> YOU SHOULD REMOVE IT });