2010-08-19 63 views
1

我在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不会嘲笑它们。

回答

3

有几件事可能会有所帮助 - 首先,您可以通过设置IComponentContext.Resolve()来模拟Resolve()与Moq的呼叫,其中所有扩展方法委托给该呼叫。

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

如果你需要使用(并因此模拟)​​或类似的界面,您可以使用可能会做同样的事情Func,IIndex和/或Owned关系类型。

希望这会有所帮助! 尼克

+0

哦咄!我应该更看重我最初的问题。问题已解决。非常感谢Nicholas!实际上,我在应用程序中的一个位置传递了一个ContainerBuilder,只是为了引导程序,并且希望确保它能够正确注册我的模块。 – 2010-08-19 09:00:21

2

不幸的是,目前在隔离器中有一个错误,它可以防止伪造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); 
    } 
} 
+0

感谢您的回答hmemcpy!我会这样做,但我实际上也是在伪装构建器,因为它是引导程序的传入依赖项。 – 2010-08-19 08:57:57

相关问题