我有一个正在尝试测试的服务类,但遇到了一些困难
此类具有私有构造函数,因此必须从返回 Lazy _singleton 值的静态 Instance 属性创建它。
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() 方法,但它一直抱怨我没有公共构造函数。如果我将此构造函数设置为 public,我仍然会收到一个似乎来自 Lazy func 的错误。
有人可以帮忙吗?我可能有不同类型的设计问题。我不知道它是否可以轻松修复。
编辑 1: 我没有任何 IoC 容器,因此我可以将我的服务注册为单例。我试图使用这种方法来模拟依赖服务的注入,这样我就可以用 mock 编写测试。
我已经取得了一些进展,但我也不确定我是否喜欢它......无论如何我会分享我所拥有的
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 构建我的类并冻结注入服务的模拟。
我可以这样使用静态类
My.Service.DoSomething();
在我的测试中
Fixture.Freeze<Mock<IInjectedService>>().Setup(...);
var service = Fixture.Create<MyService>();
service.DoSomething();
// assert my things