Сброс вызова на Жасмин шпион не возвращается
Я использую Жасмин (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 в отношении шпионских функций. Смотрите Jasmine docs здесь.
В частности, вы сбрасываете шпиона с помощью
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(); }); }); });Смотрите fiddle здесь
Другой способ написать это:
spyOn(foo, 'bar'); expect(foo.bar).toHaveBeenCalled(); foo.bar.calls.reset();
Comments