Функциональность внутри DatabaseInteraction
, которая вызывает исключение, должна быть абстрагирована к другому классу, который реализует интерфейс.Затем этот интерфейс можно смоделировать для использования в модульном тестировании.
Например:
public class BalanceCalculator
{
readonly IDatabaseInteraction _databaseInteraction;
public BalanceCalculator(IDatabaseInteraction databaseInteraction)
{
_databaseInteraction = databaseInteraction;
}
public Decimal CalcBalance()
{
//Stuff I want to test
_databaseInteraction.Interaction();
return 5.0D; //This is the value I want to have tested.
}
}
Затем в модульном тесте это можно сделать так (используя Moq):
[Test]
public void CheckValueTest()
{
Mock<IDatabaseInteraction> mockInteraction = Mock<IDatabaseInteraction>();
BalanceCalculator balanceCalculator = new BalanceCalculator(mockInteraction.Object);
decimal result = balanceCalculator.CalcBalance();
Assert.AreEqual(5.0D, result);
}
IDatabaseInteraction
по идее ничего не делает, поэтому нет никаких шансов на исключение или какую-либо несвязанную функциональность.
Для получения дополнительной информации, прочитайте Инверсия управления, это действительно полезно для тестируемости.