У меня есть класс обслуживания, который я пытаюсь протестировать, и у меня возникают некоторые трудности
Этот класс имеет закрытый конструктор, поэтому его необходимо создать из свойства c instance, возвращающего Lazy _singleton value.
public class MyService : IMyService
{
private static readonly Lazy<IMyService> _singleton = new Lazy<IMyService>(() => new MyService(new InjectedService()));
public static IPermissionService Instance = _singleton.Value;
private readonly IInjectedService _injectedService;
private MyService(IInjectedService injectedService) => _injectedService = injectedService;
// instance method I want to test
public void DoSomething()
{
}
}
Я пытаюсь использовать AutoFixture и AutoMoq для создания моего объекта, используя метод Create (), но он продолжает жаловаться, что у меня нет конструктора publi c. Если я установлю этот конструктор publi c, я все равно получу ошибку, которая, кажется, исходит от Lazy fun c.
Может кто-нибудь помочь? У меня, наверное, другие проблемы с дизайном. Я не знаю, можно ли это легко исправить.
Редактировать 1: У меня нет контейнера Io C, поэтому я могу зарегистрировать свой сервис как одиночный. Я пытался использовать этот метод для имитации внедрения службы зависимостей, чтобы я мог писать тесты с имитациями.
Я добился определенного прогресса, но я не уверен, что он мне тоже нравится ... В любом случае, я Я поделюсь тем, что у меня есть
public static class My
{
private static readonly Lazy<IMyService> _singleton = new Lazy<IMyService>(() => new MyService(new InjectedService()));
public static IPermissionService Service = _singleton.Value;
}
public class MyService : IMyService
{
private readonly IInjectedService _injectedService;
public MyService(IInjectedService injectedService) => _injectedService = injectedService;
// instance method I want to test
public void DoSomething()
{
}
}
Таким образом, я могу построить свой класс с помощью AutoFixture и заморозить макет injectedService.
И я могу использовать класс stati c таким образом
My.Service.DoSomething();
А в моих тестах
Fixture.Freeze<Mock<IInjectedService>>().Setup(...);
var service = Fixture.Create<MyService>();
service.DoSomething();
// assert my things