编写测试失败的单元测试?

时间:2010-05-17 09:10:53

标签: unit-testing

假设我有一个接受用户名和密码的函数,然后从数据库中检索记录并对该数据执行以下检查

  • 今天的日期超出了日期范围
  • 用户已停用
  • 进行参数比较

如果满足以下任何条件,则抛出异常。

显然我想编写我的单元测试来测试他的逻辑,但是如果我做了异常会被抛出而我的测试会失败,这是不正确的 - 是吗?

3 个答案:

答案 0 :(得分:6)

由于您没有说明您正在使用哪个测试框架,因此我无法详细说明,但框架将允许您将测试标记为期望异常。这将在抛出异常时停止测试失败,并允许您检查异常本身的类型和内容。

另一方面,如果你使用的框架不支持这个(虽然我认为没有)你可以手动在测试中添加一个try ... catch块,所以异常不会传播出来导致测试失败。

答案 1 :(得分:2)

是的,您的测试将正确抛出异常,但在大多数(所有?)测试框架中,您可以指定预期的异常并且测试将通过。

在MSTest和NUnit中

[ExpectedException(typeof(ArgumentException))]

请注意可能抛出异常的情况,但原因不是您期望的原因。

答案 2 :(得分:1)

我不确定我在这里看到问题。调用者和被调用者之间存在契约,无论该契约是否涉及抛出异常,还是错误返回代码(例如,如果异常被捕获并被转换为返回代码) ,你只需要检查问题是否以某种方式发出信号。

例如,如果您的合同规定如果数据库未打开,getDbRow()将抛出DbNotOpenException,请执行以下操作:

db.Close()
try:
    x = db.getDbRow()
catch DbNotOpenException e:
    return PASSED_TEST
return FAILED_TEST

换句话说,如果您的单元测试期望特定情况的特定异常,他们应该捕获它并报告为好。如果不发生 ,则应标记失败。