我對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