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

The*_*ght 1 c# asp.net unit-testing unity-container

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

public static IUnityContainer ContainerHolder { get; set; }

IUnityContainer IContainerAccessor.Container
{
    get { return ContainerHolder; }
}
Run Code Online (Sandbox Code Playgroud)

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

然后我有一个UnityLocator类,它允许我跨应用程序访问此属性:

public static class UnityLocator
    {        
        private static IUnityContainer Container
        {
            get
            {
                return ((IContainerAccessor)HttpContext.Current.ApplicationInstance).Container;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

一切正常!

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

UnityLocator.GetInstance<IThemeManager>();

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

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

    }
Run Code Online (Sandbox Code Playgroud)

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

现在,我想配置我的单元测试运行.

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

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

谢谢

更新:UnityLocator.GetInstance添加.

Dan*_*ite 5

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

单元测试你不应该担心任何具体的实现或依赖(除了被测试的类).

对我而言,让您的IoC全球可用是一个糟糕的设计选择.您应该通过属性或构造函数注入依赖项.