Сброс вызова на Жасмин шпион не возвращает
Я использую шпион Jasmine (2.2.0), чтобы узнать, вызывается ли определенный обратный вызов.
Тестовый код:
it('tests', function(done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function() {
expect(spy).toHaveBeenCalled();
done();
});
});
Это работает как ожидалось. Но сейчас я добавляю второй уровень:
it('tests deeper', function(done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function() {
expect(spy).toHaveBeenCalled();
spy.reset();
return objectUnderTest.someFunction(spy);
}).then(function() {
expect(spy.toHaveBeenCalled());
expect(spy.callCount).toBe(1);
done();
});
});
Этот тест никогда не возвращается, потому что, по-видимому, done
обратный вызов никогда не вызывается. Если я уберу строку spy.reset()
Тест завершается, но, очевидно, не соответствует последним ожиданиям. Тем не менее callCount
поле кажется undefined
, скорее, чем 2
,
2 ответа
Решение
Синтаксис для Jasmine 2 отличается от 1.3 в отношении шпионских функций. Смотрите документацию по Жасмин здесь.
В частности, вы сбросили шпион с spy.calls.reset();
Вот как должен выглядеть тест:
// Source
var objectUnderTest = {
someFunction: function (cb) {
var promise = new Promise(function (resolve, reject) {
if (true) {
cb();
resolve();
} else {
reject(new Error("something bad happened"));
}
});
return promise;
}
}
// Test
describe('foo', function () {
it('tests', function (done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function () {
expect(spy).toHaveBeenCalled();
done();
});
});
it('tests deeper', function (done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function () {
expect(spy).toHaveBeenCalled();
spy.calls.reset();
return objectUnderTest.someFunction(spy);
}).then(function () {
expect(spy).toHaveBeenCalled();
expect(spy.calls.count()).toBe(1);
done();
});
});
});
Смотрите скрипку здесь
Еще один способ написать это:
spyOn(foo, 'bar');
expect(foo.bar).toHaveBeenCalled();
foo.bar.calls.reset();