最佳答案
在 Jest 中有没有模拟全局对象(如 navigator
或 Image
*)的方法?我已经基本上放弃了这一点,把它留给了一系列可模拟的实用方法。例如:
// Utils.js
export isOnline() {
return navigator.onLine;
}
测试这个微小的函数很简单,但是很棘手,而且根本不确定。我能走75% 的路,但我只能走这么远:
// Utils.test.js
it('knows if it is online', () => {
const { isOnline } = require('path/to/Utils');
expect(() => isOnline()).not.toThrow();
expect(typeof isOnline()).toBe('boolean');
});
另一方面,如果我可以接受这种间接访问,我现在可以通过以下实用程序访问 navigator
:
// Foo.js
import { isOnline } from './Utils';
export default class Foo {
doSomethingOnline() {
if (!isOnline()) throw new Error('Not online');
/* More implementation */
}
}
像这样的确定性测试。
// Foo.test.js
it('throws when offline', () => {
const Utils = require('../services/Utils');
Utils.isOnline = jest.fn(() => isOnline);
const Foo = require('../path/to/Foo').default;
let foo = new Foo();
// User is offline -- should fail
let isOnline = false;
expect(() => foo.doSomethingOnline()).toThrow();
// User is online -- should be okay
isOnline = true;
expect(() => foo.doSomethingOnline()).not.toThrow();
});
在我使用过的所有测试框架中,Jest 感觉像是最完整的解决方案,但是每当我为了让它可测试而编写笨拙的代码时,我感觉我的测试工具让我失望了。
这是唯一的解决方案还是我需要添加重新连接?
* 不要傻笑。 Image
对于连接远程网络资源非常有用。