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, до выяснения результата теста?
Ответы
Ответ 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