Jasmine 2.0 как ждать реального времени перед запуском ожидания

Я пытаюсь проверить API PostMessage, поскольку есть небольшая задержка до получения сообщения. Я не могу запустить ожидание сразу после отправки сообщения.

В жасмине 1.3 я использовал wait() за несколько миллисекунд перед запуском ожидания, и это сработало нормально. Однако с jasmine 2.0 wait() устарел, и теперь кажется, что все внутри setTimeout не запускается, если не вызвано done(), ведь в моем случае это не режет, так как я действительно хочу ждать в реальном времени, прежде чем запускать свое ожидание..

Не уверен, что все это имеет смысл, если это так, мне понравятся некоторые указатели на то, как я могу это сделать. Спасибо!

Ответ 1

Вместо ожидания некоторого количества миллисекунд, жасмин имеет крючки, чтобы ждать, пока функция не вернется. На этой странице есть хороший пример, и я скопировал его здесь, чтобы показать конкретный способ тестирования обратных вызовов 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();
    });
});

EDIT:

Поскольку вы проверяете, что ваше приложение выполняет специальный обратный вызов, вы можете просто заменить этот обратный вызов шпионом вместо создания нового, как я.

Jasmine 2.0 добавил обратный вызов стиля "done", поэтому вы должны иметь возможность сделать что-то вроде: (я не тестировал синтаксис этого, но, надеюсь, хороший старт)

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

Ответ 2

Это работает для меня:

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

Сначала была функция beforeAll, но она завершится при вызове выполненной функции обратного вызова. Поэтому, если вы используете функцию setTimeout с 5000, она будет ждать 5000 миллисекунд, прежде чем продолжить.