javascript - 如何测试检查窗口的脚本是否用开玩笑未定义?
问题描述
使用导入的类,我通常会jest.mock('foo.js')
添加我的实现......但它不适用于 window 对象。即使我可以在我的测试中正确地模拟它,当我运行脚本时,窗口也不会被模拟。我仍然希望能够在浏览器环境中运行此测试,那么我将如何在脚本环境与测试环境中模拟窗口对象?
下面是我一直在使用的当前方法的人为代码......
foo.js
export default class Foo {
validate() {
if (window === undefined) {
throw new Error('must be run in a browser')
}
}
}
foo.test.js
import Foo from 'foo.js'
it('should throw an error if not in a browser', () => {
const foo = new Foo()
const validateError = () => {
foo.validate()
}
let windowSpy = jest.spyOn(global, 'window', 'get')
windowSpy.mockImplementation(() => undefined)
// this passes
expect(window).toBeUndefined()
// this fails
expect(validateError).toThrow()
})
解决方案
你可以delete global.window
试一试(仅在 repl.it 上测试过)
const Foo = require('./Foo');
describe('Foo', () => {
const foo = new Foo()
describe('if there is NO global window', () => {
beforeAll(() => {
delete global.window
})
it('should throw an error', () => {
expect(() => foo.validate()).toThrow()
})
})
describe('if there IS a global window', () => {
beforeAll(() => {
global.window = {}
})
it('should not throw an error', () => {
expect(() => foo.validate()).not.toThrow()
})
})
})
推荐阅读
- regex - 使用 wget 和 grep 从页面中提取超链接
- elixir - 如何在设备神经上复制crt文件
- assembly - Objdump 在已编译的程序集中将 fsubrp 交换为 fsubp?
- python - 查找具有给定长度的“运行”的十进制字符串的数量
- python - 无法使用 win32com.client 打开只读 Microsoft Word 文件
- php - 使用where子句计算sql数据的行数
- gatsby - 盖茨比数百次生成相同的头像
- php - 当我使用 Laravel 将文件上传到 MySQL 时,我的数据库表中有两个单独的行用于每个请求
- android - Picasso 未将 Firebase 存储中的图像加载到 RecyclerView
- apache-spark - PySpark:向行矩阵添加一列