Подтвердить что ты не робот

Почему мне нужно вызвать spyOn в beforeEach()?

У меня есть простой набор тестов, в котором есть одна функция it. Я хочу увидеть, вызвана ли какая-то функция внутри функции, которую я вызываю, поэтому у меня есть что-то вроде этого:

describe("doStuff", function () {
    var foo = new Foo();
    spyOn(foo, "doOtherStuff");
    foo.doStuff(true);
    it("should do stuff and other stuff", function() {
        expect(foo.stuffDone).toBe(true);
        expect(foo.doOtherStuff).toHaveBeenCalled();
    });
});

Однако это дает мне ошибку: Expected a spy, but got Function.

Осмотрев некоторые, я увидел, что все примеры имели spyOn в beforeEach. Итак, я изменил свой тест на:

describe("doStuff", function () {
    var foo = new Foo();
    beforeEach(function() {
        spyOn(foo, "doOtherStuff");
        foo.doStuff(true);
    });
    it("should do stuff and other stuff", function() {
        expect(foo.stuffDone).toBe(true);
        expect(foo.doOtherStuff).toHaveBeenCalled();
    });
});

И это работает. Я новичок в жасмине, поэтому я могу просто пропустить что-то очевидное, но я просто хочу знать, почему это должно быть в beforeEach для spyOn для работы. Достаточно просто использовать beforeEach, но я хочу лучше понять, что происходит. Спасибо.

4b9b3361

Ответ 1

Это просто потому, что Жасмин запускает Specs в другом закрытии. describe и it вызывает только регистровые обратные вызовы, которые добавляются в очередь, а затем выполняются Жасмином позже. И Жасмин всегда очищает шпионов...

Но вы также можете добавить spyOn к обратному сообщению it.