Жасмин 2.0: рефакторинг 1.3 прогонов() и ожидания для()
Недавно выпущенный Jasmine 2.0 удаляет функции ожидания и runs()
из Async Jasmine 1.3.
У меня есть старые 1.3 теста, которые я хотел бы перейти к новому стилю.
Для ожиданий в большинстве случаев кажется, что вы можете писать beforeEach()
и afterEach()
тщательно для того же эффекта.
Каков наилучший способ воспроизведения runs()
, который просто выполняет последовательно выполняемые функции?
Моя первая попытка:
runs(function() {
expect(true).toBe(true);
}
становится
(function() {
expect(true).toBe(true);
})()
Ответы
Ответ 1
В вашем блоке() можно использовать setTimeout.
it("is asynchronous", function(done) {
var isItDone = false;
$.ajax('/some/url').success(function() { isItDone = true; });
setTimeout(function(){
expect(isItDone).toBeTrue();
done(); // call this to finish off the it block
}, 500);
});
Тем не менее, я обнаружил, что это значительно замедлило мой тестовый набор, поэтому я создал собственное расширение, которое воссоздает функциональность опроса, которая ждет. При условии.
https://gist.github.com/abreckner/110e28897d42126a3bb9
Ответ 2
В жасмине 1.3 и предыдущем, runs
и waits
/waitsFor
должны были быть необходимы, только если у вас был асинхронный код, который вам нужно было дождаться, пока он не будет выполнен до выполнения следующей части теста. В этом случае у вас будет что-то вроде:
it("is asynchronous", function() {
var isItDone = false;
runs(function() {
$.ajax('/some/url').success(function() { isItDone = true; });
});
waitsFor(function() {
return isItDone;
});
runs(function() {
// this won't run until the waitsFor returns true
});
});
Jasmine 2.0 перешел на использование обратного вызова done
для beforeEach
, it
и afterEach
, если они делают что-то асинхронное, что вам нужно ждать.
beforeEach(function(done) {
$.ajax('/some/url').success(done);
});
it("is asynchronous", function() {
// this won't run until the done callback is invoked from the beforeEach
});