Я в .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);