StructureMap:使用常规参数,除非在ObjectFactory中配置

时间:2013-09-27 15:34:36

标签: c# unit-testing mocking structuremap

我觉得我正在尝试完成一些不完全是“StructureMap方式”的东西,或者它可能是但我只是不知道该怎么做。我希望有人可以帮助我:

我正在编写一个插件,需要Execute方法传递IServiceProvider(由运行我的插件的应用程序提供)。
目前,我的代码看起来像这样:

public void Execute(IServiceProvider serviceProvider)
{
    //The serviceProvider is used to extract references to other objects it supplies:
    this.Context = serviceProvider.GetService<IPluginExecutionContext>();

    //This could go more than one level deep:
    this.Acme = this.Context.Acme;

    //Do something with this.Context and this.Acme here...
}

这在生产中运行时很好。但是,当我对此插件进行单元测试时,我希望能够使用StructureMap插入我的模拟版本的IPluginExecutionContext或Acme。

现在,我知道如何让StructureMap注册特定接口的具体类型:

ObjectFactory.Initialize(x =>
{
    x.For<IPluginExecutionContext>()
     .Use<MockedPluginExecutionContext>();
});

但如果配置了如何让我的Execute实现使用此MockedPluginExecutionContext,或者如果未配置,则使用serviceProvider.GetService<IPluginExecutionContext>()返回的值?

1 个答案:

答案 0 :(得分:0)

使用NSubstitute我会执行以下操作来单独测试Execute(如果这是你想要做的):

// arrange
var objectUnderTest = ...
var mockPluginExecContext = new MockedPluginExecutionContext();
var mockProvider = Substitute.For<IServiceProvider>();
mockProvider.GetService<IPluginExecutionContext>.Returns(mockPluginExecContext);

// act
objectUnderTest.Execute(mockProvider);

// assert
Assert.IsTrue(...);