使用TypeMock模拟Autofac的“Resolve”扩展方法

时间:2010-05-01 13:53:12

标签: c# visual-studio-2010 mocking autofac typemock

我正在尝试模拟Autofac解析,例如

using System;
using Autofac;
using TypeMock.ArrangeActAssert;

class Program
{
    static void Main(string[] args)
    {
        var inst = Isolate.Fake.Instance<IContainer>();
        Isolate.Fake.StaticMethods(typeof(ResolutionExtensions), Members.ReturnNulls);
        Isolate.WhenCalled(() => inst.Resolve<IRubber>()).WillReturn(new BubbleGum());
        Console.Out.WriteLine(inst.Resolve<IRubber>());
    }
}

public interface IRubber
{}

public class BubbleGum : IRubber
{}

来自Moq,TypeMock的语法和异常让我感到很困惑。最初在TestMethod中运行它后,我不断得到一个类似“WhenCalled无法在没有补充行为的情况下运行”的异常。我尝试为每个人和他们的母亲定义行为,但无济于事。

然后我通过测试运行调试,看到Autofac发出了一个实际的异常:IRubber尚未注册。

所以很明显,静态Resolve功能并没有被伪造,而且无论我如何处理它都无法伪造它。

Isolate.WhenCalled(() => ResolutionExtensions.Resolve<IRubber>(null)).WillReturn(new BubbleGum());

...从Autofac抛出一个异常,抱怨IComponentContext不能为null。提供它假装伪造的IContainer(或伪造IComponentContext)让我回到“IRubber not registered”错误。

1 个答案:

答案 0 :(得分:2)

这可能是逆流而行的案例之一 - 创建'真实'容器所需的代码量,并且注册了相应的依赖关系,与TypeMock的配置相比更少或类似。我建议走那条路。

而不是让目标组件完全依赖于IContainer,你可以使用像Func这样的“关系类型”,除了易于模拟之外,它还被Autofac隐式支持并且更具表现力。 http://nblumhardt.com/2010/01/the-relationship-zoo/提供了有关该方法的更多信息,http://code.google.com/p/autofac/wiki/DelegateFactories也是如此。