2

我正在尝试模拟 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 不能为空。给它提供可能是伪造的 IContainer (或伪造 IComponentContext )让我回到“IRubber 未注册”错误。

4

1 回答 1

2

这可能是逆流而上的情况之一——创建一个“真实”容器所需的代码量,并注册了适当的依赖项,与 TypeMock 的配置相比更少或相似。我建议走这条路。

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

于 2010-05-27T21:53:04.613 回答