题
我将其发布在Typemock论坛上,但太急躁,无法在那里等待回复。这是一个非常n00b的问题。
我正在尝试设置一个假偶像。这是我所拥有的:
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(),对吗?我只是将其设置为返回伪造的图表。
无关的背景信息:我正在试用Typemock,因为AutoFac广泛使用扩展方法,而欧格不会模拟它们。
解决方案
几件事可能会有所帮助 - 首先,您可以嘲笑 Resolve()
通过设置呼叫量密码 IComponentContext.Resolve()
, ,所有扩展方法委派给。
其次,AUTOFAC的设计使您不必从组件中使用其界面。请参阅示例:
- http://nblumhardt.com/2010/01/the-relationship-zoo/
- http://code.google.com/p/autofac/wiki/typednamedandkeyedservices 和
- http://code.google.com/p/autofac/wiki/delegatefactories
您需要使用的地方(因此模拟) IContainer
或类似的界面,您可能可以使用 Func
, IIndex
和/或 Owned
关系类型。
希望这可以帮助!缺口
其他提示
不幸的是,当前有一个隔离器中的错误,可以防止伪造自动配置容器。我们正在努力尽快解决它。
同时,是否有一个原因您不使用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);
}
}
不隶属于 StackOverflow