繁体   English   中英

将 AutoFac 属性注入与 Moq 结合使用

[英]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);

使用ServiceFooIService实现 class :

public class ServiceFoo : IService` { }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM