- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在类里面我使用这段代码:
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/
我有这个 IoC 类: public static class IoC { private static IUnityContainer container; private stat
作为关于 unity 的基本演示的一部分,我创建了以下控制台应用程序(有点冗长): IUnityContainer container = new UnityContainer();
我有一个带有内部构造函数的类,想从 Unity (2.0) 中解析它。 public class MyClass { internal MyClass(IService service) {
我有这个代码: 1: IUnityContainer container = new UnityContainer(); 2: container.LoadConfiguration(); 第 1 行
UnityContainer.Resolve() 将实例化没有通过反射显式注册的类,允许这样的事情: using System; using Microsoft.Practices.Unity; na
我想显式“释放”Unity 解析的对象实例。我希望 Teardown 方法应该完全用于此目的,所以我尝试了这样的方法: container.RegisterType(typeof(IMyType),
假设我有一个依赖于接口(interface) IFace 的类,以及注入(inject)到构造函数中的其他几个依赖项(由 ... 描述)。我还有 2 个 IFace 接口(interface)的实现。
所以在我当前的代码中,我正在开发某种通知管理器。 我的想法是我的主要 BL 将在每次方法调用时使用这个通知管理器。因此可能只有一个通知管理器(我猜是单例)。 当您使用通知管理器时,您可以通过 SMS\
在类里面我使用这段代码: public User CurrentUser { get { var unityContainer
我有一个 MVC 应用程序,它具有采用 IDomainService 的 Controller。DomainService 类构造函数采用 IRepository并且 Repository 类构造函数
我是 Unity 应用程序 block 的新手,在尝试实现以下内容时遇到了一些困难。我有一个父子容器。当我解析子容器的新实例时,我想使用 CreateChildContainer 方法将新的 Unit
这是一个示例控制台应用程序(添加 Unity NugGet 包后它将运行良好)似乎显示了 Unity 中的错误: using System; using Microsoft.Practices.Uni
我想知道是否有一种简单的方法可以从统一容器中删除已经注册的类型,或者至少用另一个替换现有的接口(interface)/类型映射。仅将另一个类类型映射到一个接口(interface)并且旧的类类型被覆盖
我正在向我的库中添加依赖项注入(inject),为此我使用了 Unity。我想知道我是否需要采取一些额外的步骤来使 Unity Container 线程安全。我找到了几篇讨论线程安全容器的文章(例如:
我有以下类(class): public class Foo : IFoo { public Foo(IBar[] bars); } IBar有多种实现,都注册在UnityContainer中
我有以下类(class): public class Foo : IFoo { public Foo(IBar[] bars); } IBar有多种实现,都注册在UnityContainer中
我有一个代码示例,看起来像这样。 public class AdventureWorksRepository { [Dependency] private AdventureWorks
我有以下代码 var container = new UnityContainer(); //LINE 1 container.RegisterType()
我有一个使用 Unity 的应用程序。在应用程序的一个区域中,代码扫描程序集以使用以下代码注册类型(自动注册): public class CommonRegistry : UnityRegistry
这似乎是一个愚蠢的问题,因为在我的代码中一切正常,但我已经用我的 Unity 容器 _ambientContainer 以这种方式注册了一个单例: _ambientContainer.Registe
我是一名优秀的程序员,十分优秀!