2

私は基本的に次のように見えるテスト中のコードを持っています(特定のコードは質問にとって重要ではありません。説明のためにここにあります):

public ICollection<Product> GetByCategory(string category, ISession session)
{
    return session
        .CreateCriteria(typeof(Product))
        .Add(Restrictions.Eq("Category", category))
        .List<Product>();
}

これはメソッドチェーンを使用します(そして私が探しているソリューションは流暢なインターフェース構文にも適用されます)。

私はこの特定の例の解決策を見つけることに興味はありません。より一般的な問題を解決することに興味があります。この例では、CreateCriteriaの期待値のみを追加したいと思います。ただし、これを行うと、CreateCriteriaにスタブを返さなくても、Addメソッドがnullを返すため、NullReferenceExceptionが発生します。

追加のメソッドがチェーンされている場合や、Addメソッドが削除されている場合でも、テストを引き続き機能させたいです。

メソッドチェーンを使用するときに、テストダブル/予想される呼び出しの数を、主張したいものだけに減らすための一般的なトリックはありますか?

私が考えることができる解決策は、型のすべてのメソッドを列挙し、異なるデフォルトの戻り値を与える期待値を持つスタブを作成するT4テンプレートを作成することです。しかし、もっと簡単なオプションがあるかどうか疑問に思っています。

私はRhino.Mocksを使用していますが、一般的な解決策をいただければ幸いです。

4

2 に答える 2

1

NHibernateIQueryインターフェイスには、このようなものが必要でした。私はCastle.DymanicProxyとRhino.Mocksを次のFake IRepositoryの実装で使用しました...

internal class FakeRepository<TTypeOfModel> : IRepository<TTypeOfModel>
{
    ....

    public IQuery GetNamedQuery(string queryName)
    {
        return MockFactory.MockWithMethodChainingFor<IQuery>();
    }

    ....
}

internal static class MockFactory
{
    public static T MockWithMethodChainingFor<T>()
        where T : class
    {
        var generator = new ProxyGenerator();

        return generator.CreateInterfaceProxyWithTargetInterface(
            MockRepository.GenerateMock<T>(),
            new MethodChainingMockInterceptor<T>());
    }
}

internal class MethodChainingMockInterceptor<T> : StandardInterceptor
{
    protected override void PerformProceed(IInvocation invocation)
    {
        if ((Type)invocation.Method.ReturnType == typeof(T))
        {
            invocation.ReturnValue = invocation.Proxy;
        }
        else
        {
            base.PerformProceed(invocation);
        }
    }
}
于 2011-08-10T10:59:20.907 に答える
1

this可能なアプローチは、流暢な API の一部であり、記録された期待を持たないメソッドを常に返す DynamicProxy でモック オブジェクトをラップすることです。期待値が記録されている (または流暢なインターフェイスの一部ではない) メソッドの通常のモック オブジェクトに委譲します。

もちろん、どのメソッドに期待が定義されているかを検出することは、MockLibrary に大きく依存します。非流暢なメソッドは、イントロスペクションを使用して簡単にテストできます。

たぶん、ライブラリの1つがすでにこれを組み込んでいますか?

于 2010-09-03T19:28:26.457 に答える