Как смоделировать агрегированный сервис Autofac с Moq? - PullRequest
0 голосов
/ 31 декабря 2018

Я в .NET 4.6.2 и использую следующие версии сборок через Nuget:

Сервис

Autofac - 4.8.1

Autofac.Extras.AggregateService - 4.1.0

Autofac.Wcf - 4.1.0

Castle.Core - 4.3.1

Тесты

Autofac.Extras.Moq - 4.3.0

Moq - 4.10.1

Настройка, которую я использую для хост-контейнера, в точности похожа на «Начало работы»"пример из Docs , и вы в итоге получаете прокси, сгенерированный из DynamicProxy, и это хорошо работает, устраняя перегрузки конструктора.

Когда дело доходит до модульного тестирования сервисов, которые используютМне кажется, что этот тип инъекции спотыкается о том, как правильно его смоделировать.

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

public interface IMyAggregateService
{
    IFirstService FirstService { get; }
    ISecondService SecondService { get; }
    IThirdService ThirdService { get; }
    IFourthService FourthService { get; }
}

public class SomeController
{
    private readonly IMyAggregateService _aggregateService;

    public SomeController(IMyAggregateService aggregateService)
    {
        _aggregateService = aggregateService;
    }
}

using (var mock = AutoMock.GetLoose())
{
    //var depends = mock.Mock<IMyAggregateService>().SetupAllProperties(); //Not working 

    //depends.SetupProperty(p => p.IFirstService, ?? );
    //depends.SetupProperty(p => p.ISecondService, ?? );
    //depends.SetupProperty(p => p.IThirdService, ?? );
    //depends.SetupProperty(p => p.IFourthService, ?? );

    var sut = mock.Create<SomeController>();

    Action action = () => sut.SomeAction();

    action.Should().xxxx

}

Итак, первая проблема, с которой я столкнулся, заключалась в том, что на IMyAggregateService нет сеттеров, поэтому метод SetupProperty не будет работать.Когда я использовал SetupAllProperties, все было нулевым во время выполнения, так что это не будет работать.Я даже вытащил код Autofac.Extras.AggregateService и проверял проект Test, но на самом деле я ничего не могу из него извлечь, кроме того, что AggregateServiceGenerator может быть полезным в какой-то момент.

Итак, мои вопросы:

«Как правильно смоделировать агрегатную службу и обеспечить ее поведение во время модульного тестирования?»

Для дополнительного кредита я также хотел бы знать, как обеспечить конкретную реализацию любых зависимостей, являющихся свойствами, например:

using (var mock = AutoMock.GetLoose())
{
    mock.Provide<IFirstService>(this.MyImplProperty);

1 Ответ

0 голосов
/ 31 декабря 2018

«Как правильно смоделировать агрегатную службу и обеспечить ее поведение во время модульного тестирования?»

Попробуйте сделать что-то подобное (это не использует automoq, просто moq:))

var firstServiceImpl= new Mock<IFirstService>();
var secondServiceImp2= new Mock<ISecondService>();

var myAggregateServie= new Mock<IMyAggregateService>();

myAggregateServie.SetupGet(x => x.FirstService ).Returns(firstServiceImpl);
myAggregateServie.SetupGet(x => x.SecondService ).Returns(secondServiceImp2);
.
.
.

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

//Mock as above
//Mock service behavior
firstServiceImpl.Setup(m=>m.Method1()).Returns(1)

//test method of you controller, lets assume that the method1 of controller 
//is only calling firstService method named Method1()

var result = SampleController.Method1(); 

Assert.IsTrue( result == 1) 
firstService.Verify(m=>m.Method1(), Times.Once()). 
...