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