假设我有一个接受用户名和密码的函数,然后从数据库中检索记录并对该数据执行以下检查
如果满足以下任何条件,则抛出异常。
显然我想编写我的单元测试来测试他的逻辑,但是如果我做了异常会被抛出而我的测试会失败,这是不正确的 - 是吗?
答案 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
换句话说,如果您的单元测试期望特定情况的特定异常,他们应该捕获它并报告为好。如果不发生 ,则应标记失败。