[英]Using AutoFac Property Injection with Moq
考虑以下 class:
public class ViewModelBase
{
public IService Service { get; protected set; }
}
以及针对 class 的测试:
using var mock = AutoMock.GetLoose();
var viewModelBase = mock.Create<ViewModelBase>();
Assert.NotNull(viewModelBase.Service);
在我的正常应用程序中,我使用Autofac.Core.NonPublicProperty
的属性注入功能将IService
依赖项自动连接到ViewModelBase
:
containerBuilder.RegisterType(typeof(ViewModelBase)).AutoWireNonPublicProperties();
在测试中,我使用Autofac.Extras.Moq
集成 package 来自动模拟ViewModelBase
的依赖项。 但是,据我所知, Autofac.Extras.Moq
仅支持构造函数注入。 这会导致测试失败,因为Service
属性不是由 Moq 自动装配的。
有没有什么优雅的方法可以使用带有 Moq 的 AutoFac 的属性注入 function?
Autofac.Extras.Moq 仅支持构造函数注入
实际上你是对的,但是AutoMock.GetLoose
有一个重载,你可以通过传递一个具有所有常规autofac功能的ContainerBuilder
委托来向模拟注入一个功能齐全的IContainer
:
public class AutoMock : IDisposable
{
//...
public IContainer Container { get; }
public static AutoMock GetLoose(Action<ContainerBuilder> beforeBuild);
//...
}
在您的情况下,扩展Autofac.Extras.Moq
不支持PropertiesAutowired()
方法,因此我们可以构建一个 ContainerBuilder 并通过委托传递它:
Action<ContainerBuilder> containerBuilderAction = delegate(ContainerBuilder cb)
{
cb.RegisterType<ServiceFoo>().As<IService>();
cb.RegisterType<ViewModelBase>().PropertiesAutowired(); //The autofac will go to every single property and try to resolve it.
};
var mock = AutoMock.GetLoose(containerBuilderAction);
var viewModelBase = mock.Create<ViewModelBase>();
Assert.IsNotNull(viewModelBase.Service);
使用ServiceFoo
的IService
实现 class :
public class ServiceFoo : IService` { }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.