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