如何在 Mocha 和 Chai 中使用 expect.to.throw?
How to use expect.to.throw with Mocha and Chai?
我正在尝试使用 Mocha 和 Chai 编写集成测试,但 Chai 似乎没有发现错误。
正在测试的代码:
export async function createUser(
username: string,
password: string,
): Promise < {} > {
const user = await User.findOne({
username
})
if (user) {
throw new UserInputError('Username is taken', {
errors: {
username: 'Username is taken',
},
})
}
if (username.trim() === '' || null) {
throw new UserInputError('Must not be empty', {
errors: {
username: 'Must not be empty',
},
})
}
const hash = crypto.createHash('sha512').update(password).digest('hex')
const newUser = new User({
username,
password: hash,
})
return newUser.save()
}
和测试代码:
it('Fails when no username is provided', () => {
const password = uuid()
expect(async() => {
await client.mutate({
mutation: gql `
mutation($username: String!, $password: String!){
createUser(username: $username, password: $password) {
id
username
}
}
`,
variables: {
username: '',
password,
},
})
}).to.throw()
})
我希望测试通过,但我的代码失败并显示以下错误消息:
AssertionError: expected [Function] to throw an error
问题是 to.throw()
需要一个函数但是使用 async
,你 return 一个 Promise
.
所以你必须使用 .to.be.rejected
而不是 to.throw()
。
您需要 chai-as-promised,您可以尝试这样的操作:
it('Fails when no username is provided', () => {
expect(client.mutate({...})).to.be.rejected;
});
不要将 async/await
用于 expect
,因为 chai
会处理它。
另外,你可以查看这个
我正在尝试使用 Mocha 和 Chai 编写集成测试,但 Chai 似乎没有发现错误。
正在测试的代码:
export async function createUser(
username: string,
password: string,
): Promise < {} > {
const user = await User.findOne({
username
})
if (user) {
throw new UserInputError('Username is taken', {
errors: {
username: 'Username is taken',
},
})
}
if (username.trim() === '' || null) {
throw new UserInputError('Must not be empty', {
errors: {
username: 'Must not be empty',
},
})
}
const hash = crypto.createHash('sha512').update(password).digest('hex')
const newUser = new User({
username,
password: hash,
})
return newUser.save()
}
和测试代码:
it('Fails when no username is provided', () => {
const password = uuid()
expect(async() => {
await client.mutate({
mutation: gql `
mutation($username: String!, $password: String!){
createUser(username: $username, password: $password) {
id
username
}
}
`,
variables: {
username: '',
password,
},
})
}).to.throw()
})
我希望测试通过,但我的代码失败并显示以下错误消息:
AssertionError: expected [Function] to throw an error
问题是 to.throw()
需要一个函数但是使用 async
,你 return 一个 Promise
.
所以你必须使用 .to.be.rejected
而不是 to.throw()
。
您需要 chai-as-promised,您可以尝试这样的操作:
it('Fails when no username is provided', () => {
expect(client.mutate({...})).to.be.rejected;
});
不要将 async/await
用于 expect
,因为 chai
会处理它。
另外,你可以查看这个