3

私はスタブしようとする次のコードを持っていますISession.Query<UnitModel>()

var unitList = new List<UnitModel>()
            {
                new UnitModel(){Name = "meters", Symbol="m"},
                new UnitModel(){Name="grams", Symbol="g"}
            };

MockRepository.GenerateMock<ISession>().Stub(x => x.Query<UnitModel>()).Return(unitList.AsQueryable<UnitModel>());

実行中、これは例外をスローします:

System.InvalidOperationException : Type 'System.Linq.EnumerableQuery`1[[MIB.DomainModels.UnitModel, MIB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' doesn't match the return type 'NHibernate.Engine.ISessionImplementor' for method 'ISession.GetSessionImplementation();'

私はここで何が間違っているのですか?スタブはどのようにすればよいISession.Query<UnitModel>()ですか?

NHibernate 3.3.0.4000

編集: UnitModelクラス:

public class UnitModel
{
    public virtual string Name { get; set; }
    public virtual string Symbol { get; set; }
}
4

2 に答える 2

6

モックISessionは通常、費用がかかり、苦痛を伴います。

Query<T>特に、はISession.GetSessionImplementation()内部で呼び出す拡張メソッドであるため、それを操作するにはそれをモックする必要があります(これは重要であり、実際には特定の実装の詳細に結び付けられます)

2つのより良い選択肢があります:

  1. NHibernateセッションに裏打ちされた実装を持ち、簡単にモックできるリポジトリインターフェイスを実装します
    • 長所:強力、制限なし
    • 短所:特定のNH機能にアクセスする必要がある場合は、独自の抽象化または車輪の再発明によって制限される可能性があります。
  2. テストにはメモリ内またはクリーンなDBを使用します
    • 長所:セットアップの作業がはるかに少なく、すべてのNH機能にアクセスできます
    • 短所:別のDBエンジンを使用すると、一部のクエリの動作が異なる場合があります。

すでにリポジトリを使用しているのでない限り、私のアドバイスは#2を使用することです。

于 2012-06-05T12:30:06.790 に答える
0

UnitModelクラスにISessionImplementorを実装すると、VisualStudioはメソッドの欠落について警告する必要があります... ISessionImplementorは内部インターフェイスであるため、あまり役立つかどうかはわかりませんが、使用すべきではないと確信しています。

于 2012-06-05T04:36:34.670 に答える