Я бы удалил логику проверки со слоя приложения (там, где живут докладчики) и извлек ее на уровень домена (там, где живут репозитории).
Тогда не выполняйте валидацию прямо там, вдокладчик, но вместо этого пусть презентатор вызывает необходимые валидаторы.
Для модульных тестов презентатора вы предоставляете презентаторам фиктивные объекты и проверяете, что для данных вызываются правильные методы проверки.
Таким образом, вы должны проверить две вещи: 1) Проверить, вызывает ли докладчик валидаторы с данными из представления. 2) Проверить валидаторы самостоятельно.
Тесты могут выглядеть следующим образом:
Для докладчика (класс CategoryPresenterTests):
[Test]
public void Add_CallsTheValidatorWithDataFromTheView()
{
_viewMock.CategoryId.Returns(p => "id");
_viewMock.CategoryName.Returns(p => "name");
_presenter.Add();
_categoryValidatorMock.Verify(x=>x.Validate("id", "name"), Times.Once);
}
[Test]
public void Add_ForwardsValidationExceptions()
{
_viewMock.CategoryId.Returns(p => "id");
_viewMock.CategoryName.Returns(p => "name");
_categoryValidatorMock.Setup(x=>x.Validate(...)).Throws<ValidationException>();
Assert.Throws<ValidationException>(() => _presenter.Add());
}
Обратите внимание, что мы не заботимся о конкретных входных данных из представления, только то, что валидатор вызывается с этими точными данными из представления и что результат (вэто исключение случая или без исключения) передается обратно.
Для валидатора (класс CategoryValidatorTests.В основном все ваши текущие тесты идут здесь):
[Test]
public void NullId_ThrowsException() {
string id = null;
string name = "test";
Assert.Throws<ValidationException>(() => _validator.Validate(id, name));
}
Обратите внимание, что я не знаю синтаксис NSubstitutes, поэтому приведенный выше псевдокод .. надеюсь, вы можете расшифровать его:)
Кроме тогоЯ бы не создавал репозитории в презентаторах, вместо этого вставлял бы их интерфейсы через конструктор (как вы это делали с IView).Затем предоставьте фиктивные объекты и, как и в случае с валидаторами, убедитесь, что докладчик правильно вызвал их.
Все вышеперечисленное должно позволить вам повторно использовать логику проверки вне докладчиков, и это потребует некоторой сложности.подальше от докладчиков, что позволяет им больше концентрироваться на своей реальной цели - посредничестве между моделью и представлением и обработке рабочих процессов.