2010-11-19 12 views
0

私はASP.NET MVC 2プロジェクトに取り組んでいます。私はこのようなタイトなデータリポジトリクラスへの依存、何かをいくつかのコントローラクラスを手渡してきた:ASP.NET MVC 2のMoqと具体的な依存関係

public class MyController : Controller 
{ 
    MyRepository myRepository = new MyRepository(); 
    // ... 
} 

クラスMyRepositoryは、具体的な、ないインタフェースです。

基本的に、私はこのコードに読み取りアクセス権を持っていますが、書き込みアクセス権はありません。私はそれが動作することを確認するためにいくつかの単体テストを書くことを試みています。言うまでもなく、私は実際にデータベースにヒットしたくないので、明らかに何らかの嘲笑が必要です。

私は単体テストやモックを始めたばかりですが、私はMoqを読んできましたが、どのように動作するのかという基本的な考え方が得られたと思います。私は正常に単純なモックリポジトリオブジェクトを作成することができました...しかし、問題は、私はまだクラスに渡す方法を知らない!

私が元のコードを書いたのであれば、具体的なクラスではなくインターフェイスを使用していて、依存性注入用の追加コンストラクタを書いていたでしょう。それがそのまま、私は混乱している。

Moqがクラスに渡すのを手伝ってもいいですか(私が模倣した場合MyController)、私はリファクタリングできるように書き込みアクセス権を申請する必要がありますか?

答えて

2

コンストラクタインジェクションを使用するように書込みアクセス権とコードを変更することをお勧めします。他のすべては、このコードに大きな価値をもたらさないハックです。あるクラスが他のクラスと強く結合している限り、それは単体テストには不可能に近づきます。何らかの方法を見つけたとしても、このテストは非常に脆く、時間の無駄になります。

1

これを正しく行うには、リポジトリの独自の模擬方法を公開する必要があります。 Moqはここであなたを助けません。この種の依存注入を可能にするには、MyControllerコードを変更するようにしてください。

コードを変更できない場合は、プライベートリフレクションを使用していつでも変更できます。コントローラの実装が変更されると、テストが中断される可能性があるため、これは脆弱です。

もちろん、リポジトリを模擬する方法を理解する必要があります。模擬用に設計されていない場合は、Molesのようなものが動作する可能性があります。

関連する問題