gpt4 book ai didi

c# - 单元测试 unityContainer.Resolve

转载 作者:行者123 更新时间:2023-11-30 19:18:04 27 4
gpt4 key购买 nike

在类里面我使用这段代码:

    public User CurrentUser
{
get
{
var unityContainer = new UnityContainer();
var httpContextHelper = unityContainer.Resolve<HttpContextHelper>();
return httpContextHelper.GetUser();
}
}

这是在 Bootstrapper.cs 文件中:

public static class Bootstrapper
{
public static void Initialise()
{
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<IHttpContextHelper, HttpContextHelper>();
DependencyResolver.SetResolver(new UnityDependencyResolver(unityContainer));
}
}

我不能在这里使用构造函数注入(inject),因为它是一个基类,重构需要相当多的工作。

但是我该如何对它进行单元测试呢?我找不到合适的方法来模拟 unityContainer.Resolve

最佳答案

首先下面的代码是错误的:

get
{
var unityContainer = new UnityContainer();
var httpContextHelper = unityContainer.Resolve<HttpContextHelper>();
return httpContextHelper.GetUser();
}

您正在创建一个新的 Unity 容器,它当然是空的,然后您正尝试从该容器中解析一些实例,这些实例将简单地调用 HttpContextHelper 的默认构造函数> 类。天哪,我讨厌 Unity,因为它在您尝试解析从未注册到容器中的实例时没有抛出异常(这就是您在这里所做的)。相反,它使用大多数已知(已注册)依赖项静默调用其构造函数。

所以这不会返回您在 Bootstrapper 中注册的实例,因为您有一个不同的 UnityContainer 实例,您在其中注册了 IHttpContextHelper 实例。

因此,重构它的第一步是使用 DependencyResolver:

public User CurrentUser
{
get
{
var httpContextHelper = DependencyResolver
.Current
.GetService<IHttpContextHelper>();
return httpContextHelper.GetUser();
}
}

现在在您的单元测试中,您可以编写自定义依赖项解析器:

public class DepepndecyResolverMock : IDependencyResolver
{
private readonly IDictionary<Type, object> kernel;
public DepepndecyResolverMock(IDictionary<Type, object> kernel)
{
this.kernel = kernel;
}

public object GetService(Type serviceType)
{
return this.kernel[serviceType];
}

public IEnumerable<object> GetServices(Type serviceType)
{
throw new NotImplementedException();
}
}

您可以为您的测试配置:

var kernel = new Dictionary<Type, object>
{
{ typeof(IHttpContextHelper), new HttpContextHelperMock() }
};
DependencyResolver.SetResolver(new DepepndecyResolverMock(kernel));

话虽如此,这段代码仍然严重错误。它可能允许您对其进行单元测试,但请我坚持,这是错误的设计。不要使用它。这使用了服务定位器模式,它是一个反模式

这样做的正确方法是反转这个类的控制,这样它就不需要获取它的依赖项,而是需要将它的依赖项注入(inject)它。因此,与其在无用的模式上浪费时间,不如重构代码,使其使用真正的依赖注入(inject)。

关于c# - 单元测试 unityContainer.Resolve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com