我对80%简单逻辑和20%复杂逻辑的项目进行TDD。如果证明方法抛出错误并且怀疑正确的方法,我发现自己测试了很多。我使用NUnit和JustMock。测试异常的正确方法
我有两种方法来做到这一点。使用ExpectedException属性并分类类型。或者写下如下。写如下的专业版,我也可以断言exception.message(如果我做了一个自定义的),并且如果测试失败,我也会显示exception.message。但我想与他人核对你是如何做到的。所以总结一下:
- 对这样的例外进行大量测试是否正常?
- 这是做正确的方式:
只是解释:一个供应商提供某些合同,一处接受一个合同,但不能有同一个供应商一个以上的合同(但五言可以有不同的供应商不同的合同)
[Test]
public void Accepting_more_than_one_contract_from_supplier_throws_exception()
{
//Arrange
var department = new Department(Guid.NewGuid(), "1234");
var supplier = Mock.Create<Supplier>();
var contract1 = Mock.Create<DeliveryContract>();
var contract2 = Mock.Create<DeliveryContract>();
var id = Guid.NewGuid();
supplier.Arrange(x => x.Id).Returns(id);
contract1.Arrange(x => x.Supplier).Returns(supplier);
contract2.Arrange(x => x.Supplier).Returns(supplier);
//Act
department.AcceptContract(contract1);
//Assert
try
{
department.AcceptContract(contract2);
Assert.Fail("Duplicate contract with supplier did not throw an exception");
}
catch (Exception ex)
{
Assert.AreEqual(typeof(ArgumentException),ex.GetType(),ex.Message);
}
}
这是一个更好的办法来做到这一点比上面? – cfs
是的,它在NUnit中定义。你不觉得它比try-catch块更好吗? –
是的,我确实这么认为,但ExceptionAttribute也是这样;)但我认为try/catch块确实显示了测试的内涵,以及它应该如何工作。此外,还可以断言异常消息,这更加独特。在声明错误的争论性错误时有一些问题,例如,如果我在另一个字段中检查空字符串,并抛出一个ArgumentException,并且测试通过了错误的条件。 – cfs