javascript - Mocha & Chai - 测试异步函数在传递无效参数时是否抛出 TypeError?
问题描述
我有这个功能:
const DEFAULT_ROLES = [
'Director',
'Admin',
]; // Default Policy
async function aliasIsAdmin(alias, roles = DEFAULT_ROLES) {
const url = 'https://foobarapi.execute-api.us-west-2.amazonaws.com/foo/bar/';
//How to test for this throw, for example?
if (typeof alias !== 'string') {
throw new TypeError(`Entity "alias" must be a string but got "${typeof alias}" instead.`);
}
if (!Array.isArray(roles)) {
throw new TypeError(`Entity "roles" must be an array but got "${typeof roles}" instead.`);
} else if (roles.some((role) => typeof role !== 'string')) {
throw new TypeError(`Entity "roles" must be an array of strings but got at least one element of type: "${typeof roles}" instead.`);
}
const { data } = (await axios.get(url + alias)); // Fetch roles that the alias holds.
return data.some((role) => roles.includes(role));
}
如何使用 Mocha 和 Chai 测试传递无效参数时函数是否抛出?
例如,async
函数aliasIsAdmin()
应该抛出TypeError: Entity "alias" must be a string but got "undefined" instead.
,因为alias
参数是undefined
针对特定调用的。
如果我做:
it('throws TypeError when alias param is not typeof "string"', async () => {
assert.throws(async function () { await aliasIsAdmin() }, TypeError, /must be string/);
});
我得到:
aliasIsAdmin
1) throws TypeError when alias param is not typeof "string"
(node:77600) UnhandledPromiseRejectionWarning: TypeError: Entity "alias" must be a string
but got "undefined" instead.
[... stacktrace continues ...]
1) aliasIsAdmin
throws TypeError when alias param is not typeof "string":
AssertionError: expected [Function] to throw TypeError
at Context.<anonymous> (test/permissions-manager-client.test.js:25:16)
at processImmediate (internal/timers.js:439:21)
at process.topLevelDomainCallback (domain.js:130:23)
我找不到带有async
函数的示例,所以我想这就是它不起作用的原因。
有针对这个的解决方法吗?
解决方案
试着把它包起来,try/catch
因为它在扔Error
it('throws TypeError when alias param is not typeof "string"', async () => {
try {
await aliasIsAdmin();
} catch(error) {
// Do your assertion here
expect(error).to.be.an('error');
expect(error.name).to.be.equal('TypeError');
expect(error.message).to.be.equal('Entity "alias" must be a string but got "undefined" instead.');
}
});
(或者)
编辑
it('throws TypeError when alias param is not typeof "string"', async () => {
await expect(aliasIsAdmin()).to.be.rejectedWith(TypeError);
});
(最后)为了更完整的解决方案,可以测试一条消息:
it('throws TypeError when alias param is not typeof "string"', async () => {
await expect(aliasIsAdmin()).to.be.rejectedWith(TypeError, 'Entity "alias" must be a string but got "undefined" instead.');
});
推荐阅读
- spring-batch - SimpleBatchConfig 没有拿起我的 DefaultBatchConfigurer
- python - 按组 WITH 条件从前一行中减去前一行
- php - Xampp 没有运行我的 php 文件,知道可能出了什么问题
- database - 邀请系统数据库模型设计
- javascript - 浏览器何时将节点添加到元素中?
- node.js - Sequelize order by 嵌套关联
- flutter - 在空值检查中操作数不能为空
- c# - Web API 应用程序中的嵌套异步和等待
- ruby-on-rails - 用户可以在使用普通电子邮件表单注册后使用 Google 登录吗?
- python - HTML/Flask 图像被获取为 json 而不是 png