2

考虑以下类:

public class ViewModelBase
{
    public IService Service { get; protected set; }
}

这个类的测试:

using var mock = AutoMock.GetLoose();
var viewModelBase = mock.Create<ViewModelBase>();
Assert.NotNull(viewModelBase.Service);

在我的正常应用程序中,我使用 的属性注入功能Autofac.Core.NonPublicPropertyIService依赖项自动连接到ViewModelBase

containerBuilder.RegisterType(typeof(ViewModelBase)).AutoWireNonPublicProperties();

在测试中,我使用Autofac.Extras.Moq集成包来自动模拟ViewModelBase. 但是,据我所知,仅支持构造函数注入Autofac.Extras.Moq。这会导致测试失败,因为该Service属性不是由 Moq 自动装配的。

有没有什么优雅的方式可以将 AutoFac 的属性注入功能与 Moq 结合使用?

4

1 回答 1

3

Autofac.Extras.Moq 仅支持构造函数注入

实际上你是对的,但是AutoMock.GetLoose有一个重载,你可以IContainer通过传递一个ContainerBuilder具有所有常规autofac特性的委托来向模拟注入一个功能齐全的函数:

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);

实现IService类为ServiceFoo

public class ServiceFoo : IService` { }
于 2019-11-25T21:59:34.743 回答