Я написал код в принципах DDD (сущности, неизменные объекты-значения, доменные службы, модель охвата домена).И я не знаю, как проводить модульное тестирование доменной службы изолированно.
Теперь мои модульные тесты доменных служб запутаны, потому что сервисы зависят от модели охвата с конкретной реализацией.
Я заглушаю реализации модели,но модель имеет проверки на наличие инвариантов в конструкторе, поэтому я не могу просто создать заглушенный пустой объект сущности / значения.
Я могу передавать сущности в доменные службы по интерфейсам, но тогда мне также нужно использовать интерфейсы для каждого объекта с поведением(сущность или объект стоимости).В этом случае я получаю набор дополнительных интерфейсов (дополнительная сложность).
Синтетический пример с доменным сервисом MoneyTransferService.
public class Account
{
public Account([NotNull] string code, [NotNull] Money debit, [NotNull] Money credit)
{
Code = code ?? throw new ArgumentNullException(nameof(code));
Debit = debit ?? throw new ArgumentNullException(nameof(debit));
Credit = credit ?? throw new ArgumentNullException(nameof(credit));
EnsureIsValid();
}
public string Code { get; }
public Money Debit { get; }
public Money Credit { get; }
public void IncreaseDebit(Money amount)
{
Debit += amount;
EnsureIsValid();
}
public void IncreaseCredit(Money amount)
{
Credit += amount;
EnsureIsValid();
}
private void EnsureIsValid()
{
//some checks for invariants
}
}
public class Money
{
//some code..
}
public class MoneyTransferService
{
public void Transfer(Account fromAccount, Account toAccount, Money amount)
{
fromAccount.IncreaseCredit(amount);
toAccount.IncreaseDebit(amount);
}
}
Есть какие-нибудь идеи, как издеваться над моделью?Большое спасибо!
PS Я использую Fakeiteasy для насмешек.