1

私は現在、より大きなC#プロジェクトに取り組んでいます。データベースレイヤーに接続するいくつかのクラスを作成しましたが、それらをテストする必要があります。使用されるテストフレームワークは、VisualStudioUltimateのものです。テスト用のモックレイヤーが与えられましたが、使い方がわかりません。

基本的に、私のメソッドは次のように機能します。

public static void bla()
{
//This is a multithreaded singleton
Connection con = Connection.Instance;

//This raises a lot of Events 
con.SomeConnection.Send(new GetBla()); 
}

MockLayerは基本的にConnectionMockであり、すべてのメソッドをモックとして実装します。メソッドを変更せずにコンをモックにする方法はありますか?

4

3 に答える 3

3

実際には、リフレクションを使用してシングルトンをモックすることができます。私の答えを参照してください:

静的シングルトンをモックする方法は?

于 2013-08-19T13:27:08.873 に答える
2

最初のステップは、やりたいことを特定することです...そして最も重要なのはSUT(被験者)を決定することです

メソッドを変更せずにコンをモックにする方法はありますか?

私はあなたがそのようなことをすることができるとは思いません、そしてあなたがそれをするための技術的な方法を見つけることができたとしても、それはお勧めできません。代わりに、たとえばリポジトリを使用してDAL層を抽象化する必要があります。このようなもの:

interface IMyRepository
{
   void Send(Bla bla);
}

これで、クラスでDIを使用して、このインターフェースへの参照を挿入できます。単体テストを作成する場合は、インターフェイスのモックを作成する必要があります。

モックを簡単に作成するために、次のツールをお勧めします。

とにかくあなたの場合、コードを変更せずにコードをテストする唯一の方法は、接続文字列をダミーデータベースに変更し、統合テストを実行することです。

残念ながら、コードはテストに適していません。静的メンバーを削除するには、コードをリファクタリングする必要があります。

私が言える最善のヒントは次のとおりです。クリーンなテストに適したコードの記述に関するガイドラインをお読みください。

次のリンクを見てください。

コードのテストの記述に興味があるのは良いことですが、TDDを使用しなかったため、つまり最初にテストを記述したため、テスト容易性を考慮せずにコードを記述しました。結果は単純です。テストの記述は次のようになります。実際のPITAとそれらを作成するには、コードをリファクタリングする必要があります。

既存の機能を壊したくないので、コードをリファクタリングしたくないことを理解しています。これは、最初からテストを作成する最大の利点の1つであり、コードをリファクタリングして、確実にテストを実行できるようになります。あなたは何も壊さなかった

于 2012-06-25T21:44:09.990 に答える
1

要するに、いや、方法はありません。これは、静的クラスとシングルトンオブジェクトを使用することの最大の欠点の1つです。1つのConnectionオブジェクトのみが存在できるというルールを定義しました。これは、常に指定した正確なインスタンスである必要があります。モックを作成し、それを使用するためにすべてのコードを取得しようとすると、そのルールに違反します。

つまり、オブジェクトをモックするには、別のインスタンスを作成して、期待されるインスタンスの代わりにインスタンスを使用できる必要があります。静的クラス(およびシングルトン)は、それが可能になるのを明示的に防ぎます。

より良いオプションは、依存性注入を使用することです。これにより、「期待される」接続クラスが常に実際の環境に登録され、モックが常に単体テストに登録されます。

于 2012-06-25T21:40:53.950 に答える