在Jest中有没有办法模拟全局对象,比如navigator,Image*?我已经非常放弃了这一点,并将其留给了一系列可模拟的实用方法.例如:
// Utils.js
export isOnline() {
return navigator.onLine;
}
Run Code Online (Sandbox Code Playgroud)
测试这个微小的功能很简单,但很苛刻,而且根本不具有确定性.我可以获得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');
});
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我对这个间接是好的,我现在可以navigator通过这些实用程序访问:
// Foo.js
import { isOnline } from './Utils';
export default class Foo {
doSomethingOnline() {
if (!isOnline()) throw new Error('Not online');
/* More implementation */
}
}
Run Code Online (Sandbox Code Playgroud)
......并确定性地测试这样......
// Foo.test.js
it('throws when offline', () => {
const Utils = require('../services/Utils');
Utils.isOnline …Run Code Online (Sandbox Code Playgroud) 我有一个方法,它依赖于new Date创建一个日期对象,然后操纵它.我正在测试操作是否按预期工作,因此我需要将返回的日期与预期日期进行比较.为了做到这一点,我需要确保new Date在测试和被测试的方法中返回相同的值.我怎样才能做到这一点?
有没有办法实际模拟构造函数的返回值?
我可以使用提供日期对象的函数创建一个模块,并且可以进行模拟.但这似乎是我代码中不必要的抽象.
一个要测试的示例函数......
module.exports = {
sameTimeTomorrow: function(){
var dt = new Date();
dt.setDate(dt + 1);
return dt;
}
};
Run Code Online (Sandbox Code Playgroud)
我该如何模拟返回值new Date()?