问题 Jasmine 2.0如何在运行期望之前等待实时


我正在尝试测试postMessage API,因为在收到消息之前有一点延迟我在发送消息后无法立即运行期望。

在jasmine 1.3中,我常常在运行期望之前等待几毫秒,并且运行正常。然而,使用jasmine 2.0 wait()已被弃用,现在似乎setTimeout中的所有内容都没有运行,除非调用done(),在我的情况下,女巫不会削减它,因为我实际上想要在运行我的期望之前实时等待..

不确定这一切是否有意义,如果确实如此,我会喜欢关于如何解决这个问题的一些指示。 谢谢!


1416
2018-01-17 02:29


起源

我有很多问题,但要开始。你为什么要测试和Ajax调用? - Dalorzo
你在使用业力还是SpecRunner.html? - Dalorzo
什么用于进行Ajax调用? - Dalorzo
@Dalorzo我正在使用testem来运行测试,我没有测试ajax调用而是测试postMessage API。从您使用发布消息发送消息的那一刻起,以及消息接收的那一刻,有一个小的延迟,如1,2毫秒 - silkAdmin


答案:


而不是等待一些毫秒,jasmine有挂钩等待函数返回。 这一页 有一些很好的例子,我在这里复制了一个,以显示测试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();
    });
});

编辑:

由于您正在测试您的应用程序是否进行了特定的回调,因此您可以使用间谍替换该回调,而不是像我一样创建新的回调。

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

5
2018-01-17 02:43



感谢输入杰夫,但在我的情况下它并没有削减它。我的公共API只是从postMessage中侦听消息并使用其他消息回答它们,所以我只能测试当收到某种类型的消息时我的应用程序会发回适当的响应。问题是postMessage API需要1,2毫秒才能到达,所以我需要等待。您链接到的页面旁边是jasmine 1.3,并且使用的方法已弃用 - silkAdmin
@silkAdmin我用一些额外的信息编辑了帖子 - 这有帮助吗? - Jeff Storey
@silkAdmin根据提供的信息我认为JeffStorey的方法看起来很好。我正在使用茉莉花2.0。我有等待可用 - Dalorzo
是的,编辑后的部分是正确的。谢谢 - silkAdmin


这对我有用:

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

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


7
2017-10-23 06:36