2014-01-17 131 views
11

我试图测试postMessage API,因为在收到消息之前存在一个小的延迟,我无法在发送消息之后运行期望值。Jasmine 2.0如何在运行期望之前等待实时

在茉莉花1.3我曾经等待()几毫秒前运行期望,并且工作正常。然而,茉莉花2.0等待()已被弃用,现在似乎setTimeout内的一切都不会运行,除非done()被调用,在我的情况下女巫不会削减它,因为我实际上想等待实时,然后运行我的期望..

不知道这一切是否有意义,如果它确实如此我会喜欢一些关于如何去做这件事的指针。 谢谢!

+0

我有很多问题,但要开始。为什么你要测试和Ajax调用? – Dalorzo

+0

您是使用karma还是SpecRunner.html? – Dalorzo

+0

使用什么来创建Ajax调用? – Dalorzo

回答

5

而不是等待一些毫秒数,茉莉花挂钩等待,直到函数返回。 This page有一些很好的例子,我在这里复制了一个来展示测试ajax回调的具体方法。只需添加一个间谍作为你的函数回调,并等待回调执行。

it("should make a real AJAX request", function() { 
    var callback = jasmine.createSpy(); 
    makeAjaxCall(callback); 
    waitsFor(function() { 
     return callback.callCount > 0; 
    }, "The Ajax call timed out.", 5000); 

    runs(function() { 
     expect(callback).toHaveBeenCalled(); 
    }); 
}); 

编辑:

既然你测试你的应用程序进行特定回调,只需更换该回调了间谍,而不是像我一样创建一个新的。

茉莉花2.0增加了一个“完成”风格的回调,所以你应该能够这样做:(我没有测试过这种语法但希望一个良好的开端)

it("should make an ajax callback with jasmine 2.0", function(done)) { 
    // this is the object you are testing - assume it has the ajax method you want to call and the method that gets called when the ajax method is finished 
    var myObject 
    spyOn(myObject, "callback").andCallFake(function() { 
     done();   
    });  
    myObject.makeAjaxCall();  
} 
+0

感谢您输入Jeff,但在我的情况下,它并未削减。我的公共API只是侦听来自postMessage的消息并使用其他消息回复它们,所以我只能测试当收到某种类型的消息时,我的应用程序会发回相应的响应。问题是postMessage API需要1.2毫秒才能到达,所以我需要等待。在你链接的页面旁边是茉莉花1.3,并且使用的方法已被弃用 – silkAdmin

+0

@silkAdmin我编辑了一些额外的信息的帖子 - 这有帮助吗? –

+0

@silkAdmin基于提供的信息我认为JeffStorey方法看起来不错。我正在使用茉莉花2.0。我有等待可用 – Dalorzo

5

这适用于me:

beforeAll(function (done) { 
    setTimeout(done, 5000); 
}); 

beforeAll函数首先发生,但当您调用done回调函数时它会结束。所以如果你使用5000的setTimeout函数,它会等待5000毫秒,然后继续。

相关问题