1

我在 TypeMock 论坛上发布了这个,但我迫不及待地等待那里的回复。这是一个非常n00b的问题。

我正在尝试设置一个假的 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 不会模拟它们。

4

2 回答 2

3

有几件事可能会有所帮助 - 首先,您可以Resolve()通过设置来模拟使用 Moq 的调用IComponentContext.Resolve(),所有扩展方法都委托给它。

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

在您需要使用(并因此模拟)IContainer或类似接口的地方,您可能可以使用Func,IIndex和/或Owned关系类型来做同样的事情。

希望这可以帮助!缺口

于 2010-08-19T03:35:47.310 回答
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);
    }
}
于 2010-08-19T07:06:15.643 回答