扩展方法不适合测试(此处描述: Mocking Extension Methods with Moq 、 http://www.clariusconsulting.net/blogs/kzu/archive/2009/12/22/Howtomockextensionmethods.aspx )。
但是可能有一些模拟 Unity 方法的解决方案吗?就我而言,我有以下功能:
public class MyManager
{
public MyManager(IUnityContainer container) : base(container) { }
public IResult DoJob(IData data)
{
IMyLog log = MyContainer.Resolve<IMyLog>();
... use log.Id ...
MyContainer.Resolve<...>();//usage for other purposes...
}
我想确保“DoJob”方法始终从容器获取“IMyLog”对象,而不是从其他来源获取......我该如何测试?
我最初的想法是改变“DoJob”方法的实现和使用:
IMyLog log = UnityContainer.Resolve(typeof(IMyLog)) as IMyLog;
但是“Resolve(Type t, ...)”也是一种扩展方法...
欢迎任何想法。
附注请注意,“我的日志”对象是在远离 MyManager.DoJob 的地方创建的...
最佳答案
我知道我参加聚会迟到了,但我遇到了同样的问题,并通过模拟以下方法解决了它 -
IUnityContainer.Resolve(Type t, string name, params ResolverOverride[] resolverOverrides);
例如 -
unityMock = new Mock<IUnityContainer>(MockBehavior.Strict);
validatorMock = new Mock<IValidator>(MockBehavior.Strict);
unityMock.Setup(p => p.Resolve(typeof(IValidator), null))
.Returns(validatorMock.Object);
以防万一有人需要模拟这个并且无法删除对容器的依赖。
关于.net - 如何模拟(使用最小起订量)Unity 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791510/