私たちはASP.NET MVCサイトを構築していますが、私は単体テストを有効にするための接続を定義する場所に苦労しています(私は '接続'を一般的に使用します - セッション、接続、アダプタ、トランザクションおよびデータベース操作を管理することができる他のタイプのデータコンテキスト)。MVCでデータ・コンテキスト(アダプタ、接続、セッションなど)をインスタンス化する場所は?
のは、我々は3つのクラスがあるとしましょう:過去には
UserController
UserService
UserRepository
を、私たちはUserServiceの方法の中にこのような何かをしたい:
Using (ISomeSession session = new SomeSession())
{
session.StartTransaction();
IUserRepository rep = new UserRepository(session);
rep.DoSomething();
rep.Save();
session.Commit();
}
しかし、それは本当にありませんでしたSomeSessionへの依存性が注入されなかったため、これをユニットテストすることが可能です。しかし、D.I. UserServiceに依存関係を挿入するには、UserServiceの存続期間中にセッションがハングアップします。 UserControllerから呼び出された複数のサービスがある場合、UserControllerがガベージコレクションされるまで、各サービスがハングアップしている可能性があります。
これをよりうまく管理する方法についてのご意見はありますか?私は明白な何かを欠いていますか
編集
申し訳ありませんが、私は明確ではなかった場合 - 私はセッション/データコンテキストと依存性注入を使用することができることを理解し、しかし、それは、サービスクラスの寿命にわたって維持されています。実行時間の長いアクション/メソッド(つまり、バッチプロセスによってサービスが呼び出されているとします)では、テスト可能性を追加する以外の理由でオープンセッションが多く発生する可能性があります。
実際の接続でテストしている場合、単体テストではなく統合テストです。 – RichardOD
リチャード - 私はそれを理解しています。私の主張は、クラスの生存期間を通じて、接続ステートメントを使用している間に、接続ステートをクラスレベルまで動かす(または少なくともコンテキストをアクティブにする)ことなく、依存関係をどのように移動するかを知りませんでした。 「使用する」ブロックは、必要に応じて接続を開き、完了したら接続を閉じるので、はるかに安全です。 –