1

我有一个如下所示的 StructureMap 约定:

public class FakeRepositoriesConvention : IRegistrationConvention
{
    public void Process(Type type, global::StructureMap.Configuration.DSL.Registry registry)
   {
        if (type.Name.StartsWith("Fake") && type.Name.EndsWith("Repository"))
        {
            string interfaceName = "I" + type.Name.Replace("Fake", String.Empty);
            registry.AddType(type.GetInterface(interfaceName), type);
        }
    }
}

我想为此实施单元测试,但我不知道该怎么做。

我的第一个想法是发送一个模拟的注册表,然后测试是否使用正确的参数调用了 AddType()。我无法让它工作,可能是因为 AddType() 不是虚拟的。Registry 实现了 IRegistry 但这对我没有帮助,因为 Process 方法不接受接口。

所以我的问题是 - 我该如何测试呢?

(我正在使用 nUnit 和 RhinoMocks)

4

1 回答 1

3

您可以完全跳过模拟并使用具有预定义虚拟类型的注册表和组件的简化版本:

// Dummy types for test usage only
public interface ICorrectRepository { }
public class FakeCorrectRepository : ICorrectRepository { }

[Test]
Process_RegistersFakeRepositoryType_ThroughInterfaceTypeName()
{
    var registry = new Registry();
    var convention = new FakeRepositoriesConvention();

    // exercise test
    convention.Process(typeof(FakeCorrectRepository), registry);

    // assert it worked
    var container = new Container(c => c.AddRegistry(registry));
    var instance = container.GetInstance<ICorrectRepository>();
    Assert.That(instance, Is.Not.Null);
}

如果您的约定如您所想的那样有效,则上述测试应该通过。

于 2012-09-18T09:44:21.410 回答