toHaveBeenCalled некорректно работает с двумя тестами Jasmine на одном и том же шпионе - PullRequest
0 голосов
/ 06 мая 2020

У меня есть шпионский объект, который я использовал в двух тестовых случаях. Я использую метод toHaveBeenCalled, чтобы проверить, вызван ли шпионский метод или нет.

Мой код отлично работает при использовании с одним тестом, но когда я использую два тестовых примера, где я использовал одного и того же шпиона, он дает неверные результат.

Согласно коду, он должен вызывать шпиона во втором вызове только для обоих тестовых случаев, но он вызывает первый вызов во втором тестовом примере.

My Source файл : MyService.js

...

this.setUserMethod1 = function () {
    if(this.loggedIn) {
        UtilService.User();
    }
}

this.setUserMethod2 = function () {
    if(this.loggedIn) {
        UtilService.User();
    }
}

...

My Spe c файл : MyService.spec.js

var UtilService = jasmine.createSpyObj('UtilService', ['User']);

UtilService.User.and.callFake(function () {
  return {
    setUser: function(){}
  };
});               

describe('MyService', function () {

 it('setUserMethod1  should do xyz', function () {
    MyService.loggedIn = false;
    MyService.setUserMethod1();
    expect(UtilService.User).not.toHaveBeenCalled();
    MyService.loggedIn = true;
    MyService.setUserMethod1();
    expect(UtilService.User).toHaveBeenCalled();
 });

 it('setUserMethod2  should do pqr', function () {
    MyService.loggedIn = false;
    MyService.setUserMethod2();
    expect(UtilService.User).not.toHaveBeenCalled();
    MyService.loggedIn = true;
    MyService.setUserMethod2();
    expect(UtilService.User).toHaveBeenCalled();
 });

});

Выдает следующую ошибку:

debug.html:38 Expected spy UtilService.User not to have been called.

Думаю, я использую одного и того же шпиона в обоих тестовых случаях, и он уже вызван один раз, что вызывает проблемы.

Могу я узнать, что я делаю не так?

1 Ответ

0 голосов
/ 08 мая 2020

У меня причина root. Я использовал одного и того же шпиона в обоих тестовых случаях. Всякий раз, когда в это время запускается второй тестовый пример, шпионский вызов уже происходит (в тестовом примере 1). Итак, во втором тестовом примере, когда я ожидал, что шпионский вызов не произойдет, это уже произошло (в тестовом примере 1). Следовательно, тестовый пример не удался.

Решение очень простое: нужно сбросить шпионский вызов в разделе beforeEach.

....
....

beforeEach(function () {
  UtilService.User.calls.reset();
});

....
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...