Как провести модульное тестирование доменной службы в DDD с моделью расширенного домена? - PullRequest
0 голосов
/ 27 марта 2019

Я написал код в принципах 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 для насмешек.

...