Jest покрытие тестирования глобальных объектов и обратных условий - PullRequest
1 голос
/ 09 мая 2019

У меня есть глобальный объект на window, у которого есть функция. В моем коде я пишу это:

if (window.foo) {
      window.foo.bar();
}

В тестах, когда window.foo имеет значение, я утверждаю, что window.foo.bar был вызван. Достаточно просто.

Jest покрытия жалуется, что я не проверяю отрицательное значение, т.е. когда window.foo не определено. Но я изо всех сил пытался понять, что утверждать.

То, что я хотел бы сделать - это макет window.foo и утверждать, что он вызывается только один раз, когда мы проверяем, имеет ли оно значение или не определено (то есть вызов window.foo.bar никогда не выполняется.

Я пытаюсь смоделировать объект глобального окна и вернуть объект, но меня смущает вопрос о том, как смоделировать и подсмотреть значение, когда оно не является функцией, а затем проверить, что к нему был получен доступ.

Любая помощь приветствуется!

1 Ответ

1 голос
/ 09 мая 2019

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

describe('window.foo', () => {
  afterEach(() => {
    delete global.foo // make sure you clean your global object after each test
  })

  it('should be called twice', () => {
    const fooSpy = jest.fn();
    const barSpy = jest.fn();
    Object.defineProperty(global, 'foo', {
      configurable: true, // very important or else you can't delete
      get() {
        fooSpy(); //we manually call our spy so we can assert later

        // and we return an object with another spy for our bar function
        return { bar: barSpy};
      }
    });

    if (global.foo) {
      global.foo.bar()
    }


    expect(fooSpy).toHaveBeenCalledTimes(2);
    expect(barSpy).toHaveBeenCalledTimes(1);
  });

  it('should be called once', () => {
    const fooSpy = jest.fn();
    Object.defineProperty(global, 'foo', {
      writconfigurableable: true,
      get() {
        fooSpy(); // we trigger the spy manually

        // we return undefined
        return undefined;
      }
    });

    if (global.foo) {
      global.foo.bar()
    }


    expect(fooSpy).toHaveBeenCalledTimes(1);
  });
});

Вы можете видеть, что это работает в здесь

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