Unit testing Jest覆盖测试全局对象和反向条件

Unit testing Jest覆盖测试全局对象和反向条件,unit-testing,global-variables,jestjs,Unit Testing,Global Variables,Jestjs,我在窗口中有一个全局对象,它有一个函数。在我的代码中,我写了以下内容: if (window.foo) { window.foo.bar(); } 在测试中,当window.foo有一个值时,我断言调用了window.foo.bar。很简单 Jest coverage抱怨我没有测试负值,即window.foo未定义时。但我一直在努力弄清楚应该坚持什么 我想做的是模拟window.foo,并断言当我们检查它是否有值或未定义时,它只被调用一次(即从不调用window.foo.bar)

我在
窗口中有一个全局对象,它有一个函数。在我的代码中,我写了以下内容:

if (window.foo) {
      window.foo.bar();
}
在测试中,当
window.foo
有一个值时,我断言调用了
window.foo.bar
。很简单

Jest coverage抱怨我没有测试负值,即
window.foo
未定义时。但我一直在努力弄清楚应该坚持什么

我想做的是模拟
window.foo
,并断言当我们检查它是否有值或未定义时,它只被调用一次(即从不调用
window.foo.bar

我试图模拟全局窗口对象并返回一个对象,但我弄不清楚如何在值不是函数时模拟并监视它,然后检查它是否已被访问


感谢您的帮助!

您可以使用getter,这样每当在getter中访问对象中的属性时,我们都可以运行多个操作,在我们的情况下,我们只需手动触发spy

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);
  });
});
你可以看到它在工作