Если вы используете функцию-шпион по функции или методу, тогда Jasmine будет рассматривать эту функцию для проверки, позвоните ей. И вызываемая функция под Jasmine Spy не выполняет свой код по умолчанию.
spyOn(methods, "a");
methods.a();
expect(methods.a).toHaveBeenCalled();
В вашем случае необходимо проверить выполнение асинхронного кода. Мы можем сделать это с done
функции:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 2000;
spyOn(methods, "b");
spyOn(methods, "с");
methods.a();
setTimeout(function(){
expect(methods.b).toHaveBeenCalled();
expect(methods.c).toHaveBeenCalled();
done();
}, MAX_ASYNC_DELAY);
});
Это будет работать, если в methods.a()
вы будете использовать в следующем:
function a() {
async.series([methods.b, methods.c], function(err) {
console.log('Done');
});
}
Если такая корректировка не представляется возможным, вы должны переписать тестовый пример в следующем:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 2000;
spyOn(window, "b");
spyOn(window, "с");
methods.a();
setTimeout(function(){
expect(b).toHaveBeenCalled();
expect(c).toHaveBeenCalled();
done();
}, MAX_ASYNC_DELAY);
});
Owen Ayres советует не использовать setTimeout
в тестовом случае. Но это невозможно в вашем случае, если вы используете Жасмин. Потому что jasmine.DEFAULT_TIMEOUT_INTERVAL
- это тайм-аут, ожидающий вызова done
. Например, ваш асинхронный тайм-аут составляет около 10000 мс, и вы устанавливаете MAX_ASYNC_DELAY
в 11000 мс. Тестовый случай будет отмечен как неудачный, потому что jasmine.DEFAULT_TIMEOUT_INTERVAL
равен 5000 мс по умолчанию. Это использование необходимо переопределить эти параметры:
var originalTimeout;
beforeEach(function() {
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000; // ms to wait for done()
});
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 11000;
// test case from above
});
afterEach(function() {
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
});
, если вы используете жасмин версию 2.2 и выше, вы можете написать:
it("should support async execution", function(done) {
var MAX_ASYNC_DELAY = 11000;
// test case from above
}, 12000);
«Не использовать тайм-ауты» --- Как еще вы можете задержать вещь? 'waitsFor' ушел :(:(:(http://stackoverflow.com/questions/37310701/how-to-use-jest-to-test-react-rendered-async-data – FizzBuzz
@FizzBuzz Я ответил на ваш вопрос вопрос, но вы можете немного уточнить свой код – Shakespeare