我正在尝试模拟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”错误。
答案 0 :(得分:2)
这可能是逆流而行的案例之一 - 创建'真实'容器所需的代码量,并且注册了相应的依赖关系,与TypeMock的配置相比更少或类似。我建议走那条路。
而不是让目标组件完全依赖于IContainer,你可以使用像Func这样的“关系类型”,除了易于模拟之外,它还被Autofac隐式支持并且更具表现力。 http://nblumhardt.com/2010/01/the-relationship-zoo/提供了有关该方法的更多信息,http://code.google.com/p/autofac/wiki/DelegateFactories也是如此。