我正在尝试使用 Jest 测试一些使用 await
和 async
的代码。我遇到的问题是抛出了异常,但 Jest 似乎没有捕获它。
例如,这里是 run
方法,用于检查 session.url
是否存在。如果没有,则抛出异常:
const args = require('args');
const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
// Loads JSON configuration file
module.exports.loadConfigFile = async (filename) => {
const contents = await readFile(filename, 'utf8');
return JSON.parse(contents);
};
// Prepare session ensuring command line flags override config
module.exports.prepareSession = async (flags) => {
if(!flags.config) return flags;
const config = await this.loadConfigFile(flags.config);
return {...config, ...flags};
};
// Runs the race application
module.exports.run = async (flags = {}) => {
const session = await this.prepareSession(flags);
if(!session.url) throw new Error('A valid URL is required');
};
这里我测试一下是否抛出异常:
describe('Race Module', () => {
test('Throws exception if no URL is provided', async () => {
const runner = await race.run();
expect(runner).toThrowError();
});
...
测试运行,似乎抛出了异常,但 jest 没有捕获它,因此没有通过:
Race Module
✕ Throws exception if no URL is provided (3ms)
● Race Module › Throws exception if no URL is provided
A valid URL is required
at Object.<anonymous>.module.exports.run (src/race.js:23:27)
at <anonymous>
有什么想法我哪里出错了吗?
我最初的想法是在测试中将 catch(() => {})
链接到 race.run()
但我不完全确定我会如何测试一下。这甚至可能不是问题。
最佳答案
修复方法是使用rejects.toThrow
。但是,请注意,此功能目前在 master 中已损坏。我必须使用测试分支。参见这里:https://github.com/facebook/jest/pull/4884
test('Throws exception if no URL is provided', async () => {
await expect(race.run())
.rejects
.toThrow('A valid URL is required');
});
关于javascript - 测试异步/等待方法。 Jest 在单元测试中未捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472682/