繁体   English   中英

如何在ASP.NET中使用IoC容器配置单元测试?

[英]How to configure unit tests with an IoC container in ASP.NET?

我已经在ASP.NET应用程序中配置了Unity,并在Application_BeginRequest中收到第一个请求时加载了配置。 然后将Unity容器作为属性存储在Global.ascx中,以便我的其他类可以访问它:

public static IUnityContainer ContainerHolder { get; set; }

IUnityContainer IContainerAccessor.Container
{
    get { return ContainerHolder; }
}

ContainerHolder,在整个应用程序中保存容器实例,并且Container属性允许在每个会话中访问此属性。

然后,我有了一个UnityLocator类,使我可以在整个应用程序中访问此属性:

public static class UnityLocator
    {        
        private static IUnityContainer Container
        {
            get
            {
                return ((IContainerAccessor)HttpContext.Current.ApplicationInstance).Container;
            }
        }
    }

一切正常!

我还有一种从Unity访问实例的方法:

UnityLocator.GetInstance<IThemeManager>();

    protected Repository(ICustomCacheManager customCacheManager)
    {
        this.Cache = customCacheManager;
    }

    protected Repository()
        : this(UnityLocator.GetInstance<ICustomCacheManager>())
    {

    }

它已在我的应用程序中使用过,以便我可以从Unity中检索现有实例,以便将其注入到其他类中。 例如,我的视图(asp.net页)将其作为依赖项注入到Presenter类中。

现在,我想配置单元测试以运行。

我该怎么办? global.ascx显然不存在,所以我认为我应该创建一个BaseTest类并让所有测试继承它。 然后在这个BaseTest类的构造函数中,建立我的实例。 这是正确的方法吗?

现在如何使用Unity配置单元测试?

谢谢

更新:UnityLocator.GetInstance已添加。

您不必担心访问IoC容器。 这违反了单元测试。

单元测试您不必担心任何具体的实现或依赖关系(被测类除外)。

对我来说,在全球范围内提供IoC是一个糟糕的设计选择。 您应该通过属性或构造函数注入依赖项。

可能使用全局应用程序类来存储服务定位器不是一个好主意。 为什么不使用内置的ServiceLocator类? 它可以在代码中的任何位置使用,并且不依赖于全局应用程序/ HttpContext。

是否在单元测试中使用容器是另一回事。 就个人而言,只要您将服务的存根实现放入容器中,我就不会反对。

编辑:使用ServiceLocator配置容器的方式:

    private void ConfigureUnity()
    {
        UnityServiceLocator locator = new UnityServiceLocator( ConfigureUnityContainer() );
        ServiceLocator.SetLocatorProvider( () => locator );
    }

    private IUnityContainer ConfigureUnityContainer()
    {
        IUnityContainer container = new UnityContainer();

        // this loads container's configuration, comment or uncomment
        container.LoadConfiguration();

        return container;
    }

然后,您可以从定位器中访问容器,例如:

var container = ServiceLocator.Current.GetInstance<IUnityContainer>();

在您的页面中,尝试执行以下操作:

public class DepartmentReportPage : Page
{
    private readonly DepartmentReportPresenter _presenter;

    public DepartmentReportPage()
    {
        this._presenter =
            UnityLocator.GetInstance<DepartmentReportPresenter>();

        this._presenter.View = this;
    }
}

暂无
暂无

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

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