【问题标题】:Using AutoFac Property Injection with Moq将 AutoFac 属性注入与 Moq 结合使用
【发布时间】:2019-11-20 21:26:56
【问题描述】:

考虑以下类:

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.NonPublicProperty 的属性注入功能将IService 依赖自动装配到ViewModelBase

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

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

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

【问题讨论】:

    标签: c# moq autofac automoq


    【解决方案1】:

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

    实际上你是对的,但是 AutoMock.GetLoose 有一个重载,你可以通过传递 ContainerBuilder 的委托和所有常规 autofac 来向模拟注入一个功能齐全的 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);
    

    IService实现类ServiceFoo

    public class ServiceFoo : IService` { }
    

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2013-02-02
      • 1970-01-01
      • 2023-03-05
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多