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

标签 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; }
}

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

然后我有一个 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 检索现有实例,以便我可以将其注入(inject)其他类。例如,我的 View (asp.net 页面)将其作为依赖项注入(inject)到它的 Presenter 类中。

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

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

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

谢谢

更新: 添加了 UnityLocator.GetInstance。

最佳答案

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

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

对我来说,让 IoC 全局可用是一个糟糕的设计选择。您应该通过属性或构造函数注入(inject)依赖项。

关于c# - 如何在 ASP.NET 中使用 IoC 容器配置单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597375/

相关文章:

C# 试图用秒表包装一个函数

c# - 无法加载 DLL 'SQLite.Interop.dll'

c# - 获取PNG中最常用的颜色

C# - 访问说明符 - 用于访问同一命名空间中的方法

asp.net - web.config 文件导致 500 内部服务器错误

java - 简单单元测试中的 URLUtil.isHttpsUrl() 错误返回值? (返回默认值=真)

c# - 如何在 Asp.net MVC 中编写 OAuth2 Web API 客户端

asp.net - "The specified domain either does not exist or could not be contacted"

java - 使用Spring Security的Principal进行单元测试方法

c# - 在 Xunit 中处理多个测试用例的首选方法是什么?