3

私のアプリケーションは Rhino.Commons - NHRepository と UnitOfWork を使用しています。私はトランザクションの With.Transaction() 構文が好きで、しばらく使用しています。

しかし、問題が発生しました。テストのために UnitOfWork をモックするにはどうすればよいですか? 特にこれは私にとって問題を引き起こしています:

With.Transaction(() => Repositories.TwinfieldSpooler.Update(spool));

Rhino.Mocks でリポジトリをモックできますが、この種のコードの UnitOfWork を簡単にモックするにはどうすればよいでしょうか?

4

4 に答える 4

3

With.Transaction は UnitOfWork.Current プロパティを使用します。UnitOfWork は静的クラスです。RhinoMocks でモックすることはできません。

UnitOfWork.Current は public static プロパティであるため、交換できます。残念ながら、セッターは内部です。

3 つのオプションが表示されます。

  • Rhino.Commons ソースを変更して UnitOfWork.Current セッターを公開し、単体テストで設定します。

  • リフレクションを使用して UnitOfWork.Current を偽の作業単位に設定します。

  • UnitOfWork.Current は内部的に Local.Data を使用して現在のトランザクションを見つけるため、次のように移動できるはずです。

    Rhino.Commons.Local.Data[UnitOfWork.CurrentUnitOfWorkKey] = myFakeUnitOfWork;

UnitOfWork.Current は IUnitOfWork であり、RhinoMocks は簡単にインターフェイスを偽造できるという朗報があります。

私は Rhino.Commons にあまり詳しくないので、Ayende は UnitOfWork を偽装する適切な方法を構築した可能性があります。これがあなたにとって非常に重要な場合は、Rhino ディスカッション グループで質問してください。

于 2009-07-20T06:10:18.237 に答える
2

データの永続性を実際にテストせずに、永続性に関するロジックテストしたかったので、同様のニーズがありました。UnitOfWorkテストのセットアップ部分で次の2行を使用すると、簡単にモック/スタブできることがわかりました。

IUnitOfWork theStubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>();
UnitOfWork.RegisterGlobalUnitOfWork(theStubUnitOfWork);
于 2009-08-12T16:28:51.990 に答える
0

ありがとうございます。しかし、実際には Rhino インフラストラクチャのモックを無視することにしました。すべてのテストで再構築された sqlite データベースの使用に関するAyende http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspxによるこの投稿を見つけました。これは素晴らしい解決策でした!

于 2009-08-03T18:15:49.353 に答える
0

他の人のためのちょっとした追加情報: Ogre Psalm33 は UnitOfWork をスタブ化する方法について言及していますが、With.Transaction も機能させたい場合は、RhinoTransaction を追加でスタブ化することができます:

IUnitOfWork stubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>();
RhinoTransaction stubTx = MockRepository.GenerateStub<RhinoTransaction>();
stubUnitOfWork.Expect(x => x.BeginTransaction(System.Data.IsolationLevel.Unspecified)).IgnoreArguments().Return(stubTx);
UnitOfWork.RegisterGlobalUnitOfWork(stubUnitOfWork);

Ayende からのメモをどこかで見たのを思い出します。彼は通常、彼が好みのCastle Automatic Transaction Managementを使用できなかったときに、最後の手段としてのみ With.Transaction を使用しました。

于 2011-08-09T01:25:53.520 に答える