假設我想編寫一個單元測試來測試方法中實現的特定功能。如果我想完全執行這個方法,我將不得不做一些額外的安裝工作(模擬對象期望等)。而不是這樣做,我使用以下方法:
- 我設置了我有興趣驗證的期望值,然後使測試方法拋出特殊類型的異常(例如TerminateTestException)。
- 進一步在單元測試中,我發現異常並驗證模擬對象的期望值。投擲特殊類型的異常終止單元測試
它工作正常,但我不確定這是不錯的做法。我不會定期這樣做,只有在節省時間和精力的情況下。有一點可以想到,使用它的一個理由是拋出異常需要很長時間,所以測試的執行速度比使用不同方法時要慢。編輯:
只是爲了澄清,我不修改SUT代碼。我所做的是提供一個模擬對象或重寫SUT類,以便在我感興趣的部分執行後SUT退出執行。
private class TestCalculationService : CalculationService
{
public bool ValidateForSyncCalled;
protected override void ValidateForSyncCall()
{
ValidateForSyncCalled = true;
throw new ExceptionToTerminateTest();
}
}
[TestMethod]
public void CalculationService_Calculate_Sync_Calls_ValidateForSyncCall()
{
InitializeMocks();
TestCalculationService calculationService = new TestCalculationService();
calculationService.MessageInstanceFactory = _mockMessageInstanceFactory;
try
{
calculationService.Calculate(null);
Assert.Fail("Exception should have been thrown");
}
catch (ExceptionToTerminateTest)
{
//ok
}
Assert.IsTrue(calculationService.ValidateForSyncCalled);
}