Подтвердить что ты не робот

Jasmine.js ожидать() не работает внутри асинхронного обратного вызова

Я знакомлюсь с Жасмином (http://pivotal.github.com/jasmine/) и нашел что-то довольно озадачивающее:

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
  });

  expect(true).toEqual(false);
});

Не работает, как ожидалось.

Однако, перемещая вызов ожидания внутри обратного вызова:

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
    expect(true).toEqual(false);
  });
});

Как-то проходит: O

После некоторой отладки: api.sendGhostRequest() выполняет асинхронный запрос ajax, и жасмин проносится мимо до завершения запроса.

Следовательно, вопрос:

Как получить жасмин, ожидающий выполнения ajax, до выяснения результата теста?

4b9b3361

Ответ 1

Изменить для Жасмина 2

Асинхронные тесты стали намного проще в Jasmine 2. Любой тест, который должен обрабатывать асинхронный код, может быть написан с обратным вызовом, который укажет на завершение теста. См. Jasmine 2 docs под заголовком Асинхронная поддержка

it('should be able to send a ghost request', (done) => {
    api.sendGhostRequest((response) => {
        console.log(`Server says ${response}`);
        expect(true).toEqual(false);
        done();
    });
});

Жасмин 1

Посмотрите waititsFor() и работает() на сайт Jasmine под заголовком Асинхронная поддержка.

Использование прогонов и ожиданий должно заставить Jasmine ждать завершения вызова ajax или для некоторого таймаута.

Код будет выглядеть так:

it("should be able to send a Ghost Request", function() {
    runs(function() {
        api.sendGhostRequest(function(response) {
            console.dir('server says: ', response);
            flag = true;
        });
    }, 500);

    waitsFor(function() {
        return flag;
    }, "Flag should be set", 750);

    runs(function() {
        expect(true).toEqual(false);
    });
}

В этом случае ожидание не получится.

Ответ 2

Как отмечалось в @pkopac, runs() и waitsFor() устарели от v2 в пользу использования обратного вызова done(), как описано: https://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support

it("should be able to send a Ghost Request", function(done) {
    var api = fm.api_wrapper;

    var success = function(response) {
        console.dir('server says: ', response);
        expect(response).toEqual('test response')
        done();
    };

    api.sendGhostRequest(success);
});

Ответ 3

Посмотрите на run() и waitfor()

В частности, вы можете вызвать waitfor, чтобы проверить, что обратный вызов был запущен в некотором роде (возможно, используя логическое значение в качестве проверки?), а затем запустить ожидание впоследствии.

позволяет вам дождаться завершения waitfor.

документация async jasmine