2010-05-17 86 views
0

比方说,我有一个接受用户名和密码的功能,它就从数据库中检索记录,并对这些数据进行以下检查编写测试失败的单元测试?

  • 今天的日期是一个日期范围
  • 用户是外禁用
  • 的参数比较时

如果任何这些条件为真则抛出异常。

很显然,我想要写我的单元测试,以测试他的逻辑,但是如果我做了一个会抛出异常,我的测试将失败,这是不正确的 - 是什么呢?

回答

2

是的,你的测试将正确地抛出一个异常,但在大多数(全部?)测试框架,您可以指定预期的异常,测试会通过。

在MSTest的和NUnit

[ExpectedException(typeof(ArgumentException))] 

只是要小心其中可能抛出异常的情况下,但对于那些比你预期等原因。

6

既然你没有说你正在使用哪个测试框架,我不能进入具体细节,但是框架将允许你将测试标记为期望异常。当抛出异常时,这将停止测试失败,并允许您检查异常本身的类型和内容。另一方面,如果您使用的框架不支持这个功能(尽管我不认为有任何不支持),您可以在测试中手动添加try ... catch块,以便异常不会传播出去并导致测试失败。

+0

+1 - 正是你应该做的。大多数单元测试框架允许您继续前进,并且如果不抛出期望的异常,将会失败。单元测试不仅应该测试那些功能在给定条件成功时工作,而且在没有这些条件的情况下适当地失败。 – 2010-05-17 09:16:01

1

我不知道我在这里看到问题。有合同主叫方和被叫方和,该合同是否涉及异常之间被抛出,或错误返回码(例如,如果将例外被叫内捕获并转换成返回代码),你只需要检查问题是否以某种方式发出信号。

例如,如果你的合同规定的getDbRow()将抛出DbNotOpenException如果数据库未打开,这样做:

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

换句话说,如果你的单元测试期望为给定的特定异常情况下,他们应该陷入困境并报告说没问题。如果发生异常不发生,他们应该标记失败。