在方法上设置行为似乎是调用方法

时间:2010-08-19 00:38:36

标签: autofac typemock

我在TypeMock论坛上发布了这个,但我太急于等待那里的回复了。这是一个非常难以理解的问题。

我正在尝试设置一个假的IContainer。这就是我所拥有的:

var container = Isolate.Fake.Instance<IContainer>(); 
var program = Isolate.Fake.Instance<IProgram>(); 

Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program);

IProgram是我代码中的一个接口)。

当我尝试运行此代码时,我收到一个Autofac异常:“请求的服务MyApp.IProgram尚未注册。”

怎么可能抛出这个异常?我实际上并没有调用container.Resolve(),对吗?我只是设置它来返回假的IProgram。

无关的背景信息:我正在试用TypeMock,因为Autofac广泛使用扩展方法,Moq不会嘲笑它们。

2 个答案:

答案 0 :(得分:3)

可能有所帮助的一些事项 - 首先,您可以通过设置Resolve()来模拟IComponentContext.Resolve()来自Moq的调用,这是所有扩展方法所委托的。

其次,Autofac的设计使您不必使用组件中的接口。参见示例:

您需要使用(并因此模拟)IContainer或类似界面,您可以使用FuncIIndex和/或{{1}执行相同的操作关系类型。

希望这有帮助! 尼克

答案 1 :(得分:2)

不幸的是,Isolator目前存在一个错误,它可以防止伪造Autofac容器。我们正在努力尽快解决它。

与此同时,您是否有理由不按预期使用Autofac,这意味着让它返回假实例,例如:

[TestFixture]
public class TestClass
{
    private ContainerBuilder builder;
    private IContainer container;

    [SetUp]
    public void SetUp()
    {
        builder = new ContainerBuilder();
    }

    [Test, Isolated]
    public void Test1()
    {
        var fakeProgram = Isolate.Fake.Instance<IProgram>();

        builder.RegisterInstance(fakeProgram).As<IProgram>();
        container = builder.Build();

        var program = container.Resolve<IProgram>();

        Assert.AreEqual(fakeProgram, program);
    }
}