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 に答える