Использование МОК для поблочного тестирования

Я сомневаюсь, являются ли они особенно дорогими. Много времен, они необходимы/необходимы.

, Хотя я настоятельно рекомендую использовать их только когда необходимый и в правильных местах / уровень вложения вместо того, чтобы повторно бросить исключение в каждый возврат вызова.

я предположил бы, что главная причина для совета состояла в том, чтобы сказать, что Вы не должны использовать выгоды попытки где, если---еще будет лучшим подходом.

97
задан Ruben Bartelink 24 March 2011 в 19:43
поделиться

3 ответа

Вообще говоря, контейнер DI не должен быть необходим для модульного тестирования, потому что модульное тестирование - это все о разделении ответственности.

Рассмотрим класс, который использует внедрение конструктора.

public MyClass(IMyDependency dep) { }

Во всем вашем приложении может быть огромное количество граф зависимостей скрыт за IMyDependency , но в модульном тесте вы все сводите к одному Test Double .

Вы можете использовать динамические макеты, такие как Moq или RhinoMocks, для генерации Test Double, но это не обязательно.

var dep = new Mock<IMyDependency>().Object;
var sut = new MyClass(dep);

В некоторых случаях контейнер с автосимулятором может быть неплохо, но вам не нужно использовать тот же контейнер DI, который использует производственное приложение .

124
ответ дан 24 November 2019 в 05:27
поделиться

Как можно использовать контейнер Ioc для модульного тестирования?

IoC будет применять парадигмы программирования это упростит изолированное модульное тестирование (то есть с использованием моков): использование интерфейсов, без new (), без синглтонов ...

Но использование контейнера IoC для тестирования на самом деле не является обязательным требованием, оно просто предоставит некоторые возможности например, внедрение макетов, но вы можете сделать это вручную.

Полезно ли управлять макетами в огромном решении (более 50 проектов) с помощью IoC?

Я не уверен, что вы имеете в виду, говоря об управлении макетами с помощью IoC. В любом случае, когда дело доходит до тестирования, контейнеры IoC обычно могут делать больше, чем просто вводить макеты. И если у вас есть приличная поддержка IDE, которая делает возможным рефакторинг, почему бы не использовать ее?

Есть опыт?

Да,

18
ответ дан 24 November 2019 в 05:27
поделиться

Я часто использую контейнер IoC в своих тестах. Конечно, они не являются «юнит-тестами» в чистом смысле. IMO Они больше BDDish и облегчают рефакторинг. Тесты призваны дать вам уверенность в необходимости рефакторинга. Плохо написанные тесты могут быть подобны заливке цемента в ваш код.

Учтите следующее:

[TestFixture]
public class ImageGalleryFixture : ContainerWiredFixture
{
    [Test]
    public void Should_save_image()
    {
        container.ConfigureMockFor<IFileRepository>()
            .Setup(r => r.Create(It.IsAny<IFile>()))
            .Verifiable();

        AddToGallery(new RequestWithRealFile());

        container.VerifyMockFor<IFileRepository>();
    }

    private void AddToGallery(AddBusinessImage request)
    {
        container.Resolve<BusinessPublisher>().Consume(request);
    }
}

При добавлении изображения в галерею происходит несколько вещей. Размер изображения изменяется, создается эскиз, а файлы сохраняются на AmazonS3. Используя контейнер, мне легче изолировать только то поведение, которое я хочу протестировать, которое в данном случае является постоянной частью.

При использовании этого метода может пригодиться расширение контейнера с автоматическим имитированием: http://www.agileatwork.com/auto-mocking-unity-container-extension/

17
ответ дан 24 November 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: