.net - 如何模拟(使用最小起订量)Unity 方法

标签 .net unit-testing extension-methods moq mocking

扩展方法不适合测试(此处描述: Mocking Extension Methods with Moqhttp://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/

相关文章:

.net - ArrayOf 将 List<T> 与 WCF 休息服务一起使用时

c# - session 超时

.net - Windows 如何区分常规 EXE 和 .NET exe?

angular - 订阅时不触发 rxjs pipeline tap/map

c# - 有没有办法判断一个参数是否有这个修饰符?

javascript - ActiveX "Class doesn' t 支持自动化”

javascript - 如何测试创建文件的实用函数

java - 如何对构造函数进行单元测试

java - 如何为自定义 Spring Batch Reader 编写 junit

c# - DbContext "using"在一行中