StructureMap:我如何单元测试注册表类?

Mar*_*ius 8 .net c# structuremap

我有一个这样的注册表类:

public class StructureMapRegistry : Registry
{
    public StructureMapRegistry()
    {
        For<IDateTimeProvider>().Singleton().Use<DateTimeProviderReturningDateTimeNow>();
    }
Run Code Online (Sandbox Code Playgroud)

我想根据我的意图测试配置,所以我开始编写测试:

public class WhenConfiguringIOCContainer : Scenario
{
    private TfsTimeMachine.Domain.StructureMapRegistry registry;
    private Container container;

    protected override void Given()
    {
        registry = new TfsTimeMachine.Domain.StructureMapRegistry();
        container = new Container();
    }

    protected override void When()
    {
        container.Configure(i => i.AddRegistry(registry));
    }

    [Then]
    public void DateTimeProviderIsRegisteredAsSingleton()
    {
        // I want to say "verify that the container contains the expected type and that the expected type
        // is registered as a singleton
    }
}
Run Code Online (Sandbox Code Playgroud)

如何验证注册表是否符合我的期望?注意:我介绍了容器,因为我没有在Registry类上看到任何可用的验证方法.理想情况下,我想直接在注册表类上进行测试.

Jos*_*gan 3

将注册表类视为一个配置文件 - 单独测试它并没有真正的意义,但您可能想测试另一个类如何响应它。在这种情况下,您将测试容器在给定注册表时的行为方式,因此通过将容器引入测试您走上了正确的道路。

在测试中,您可以请求 IDateTimeProvider 并断言返回的具体类型是您期望的类型。您还可以从容器中检索 2 个实例并断言它们是同一实例 (ReferenceEquals) 以验证单例行为。