如何在 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 会处理它。

另外,你可以查看这个