javascript - 笑话:在执行 console.error 的实用程序函数中测试 catch case?
问题描述
不确定这是否可以测试(可能需要重新考虑该功能)。
我有这个实用功能:
const getProp = (propKey) => {
const env = getCurrentEnvironment();
let prop = '';
try {
prop = constants.PROPS_TABLE[env][propKey];
} catch (err) {
const errorMsg = `Property not found for environment ${env} using key ${propKey}`;
console.error(errorMsg);
}
return prop === undefined ? '' : prop;
};
并且我对快乐路径进行了测试,但我想证明错误路径将调用 console.error 并显示预期的错误消息。
有没有办法在不改变这个功能的设计的情况下做到这一点?
解决方案
首先,它在 I/O 中直接对控制台产生副作用这一事实并不好 - 但有时这就是生活。
你可以:
- 保留对旧
console.error
值的引用 -var error = console.error
- 在
console.error
-console.error = jest.fn()
- 断言它被称为
expect(console.error.mock.calls[0][0]).toBe('
“未找到环境的属性 ....')`,并带有确切的参数 - 恢复
console.error
为原始值afterEach
总而言之,它是这样的:
var error = console.error;
afterEach(() => {
console.error = error; // revert the spy
});
test('your fn', () => {
console.error = jest.fn();
setCurrentEnvironment('test'); // or whatever getCurrentEnvironment accesses
expect(getProp('non existing')).toBe('');
expect(console.error.mocks.calls[0][0]).toBe(
'Property not found for environment test using key non existing'
);
});
推荐阅读
- python - 使用 Selenium 解析动态加载的网页
- python - 更新模型一部分的权重 (nn.Module)
- flask - 为什么路由“/login”和“/register”不起作用?
- c++ - RadioMedium 的 maxCommunicationRange 参数和 Radio 发射机的功率参数之间有什么关系?
- google-analytics - 如何从服务器端设置 Google Analytics(Firebase 分析)用户属性?
- flutter - 显示在配置文件或发布模式下运行的上下文菜单时,Flutter 基本应用程序在 Chrome 上停止响应
- opengl - 尝试访问 gl_Position 时 GLSL 顶点着色器中断
- autohotkey - AHK - 模拟 Fn 快捷键
- python - 我们可以用什么来区分 linux 和 macos AppVeyor 构建?
- java-8 - Java 8 堆转储分析