我在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不会嘲笑它们。
答案 0 :(得分:3)
可能有所帮助的一些事项 - 首先,您可以通过设置Resolve()
来模拟IComponentContext.Resolve()
来自Moq的调用,这是所有扩展方法所委托的。
其次,Autofac的设计使您不必使用组件中的接口。参见示例:
您需要使用(并因此模拟)IContainer
或类似界面,您可以使用Func
,IIndex
和/或{{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);
}
}