Сброс вызова на Жасмин шпион не возвращается



Я использую Жасмин (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.
613   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

    Ничего не найдено.