1

私はビジネスレイヤーでも同様の方法を持っています。私はユニットテストに不慣れで、時々混乱します。アイデアとして、このメソッドの動作をテストするためのより良いアプローチは何でしょうか。私はC#NUnitとMoqを使用しています

public int? AddNewCatRetID(string categoryName)
{
  int? categoryID = 0;
  Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID);

  if (categoryID.HasValue)
    return categoryID;

  return 0;
}

どこ

Adapter= Visual Studio 2008、データセットデザイナーが生成したTableAdater

AddDeveloperCategoryReturnID()=DBのストアドプロシージャを利用する関数の名前

新しいレコード「Category」を追加し、自動生成されたIDを返します。ゼロ以外の場合は、その結果をさらに処理します。

私はデータベースと話すことに興味があるべきではないことを知っています、以下はDBで何が起こっているかについての考えを与えるための手順です

PROCEDURE [dbo].[AddDeveloperCategoryReturnID]

@NAME NVARCHAR(MAX),
@CATEGORY_ID INT OUTPUT
AS
 BEGIN
 INSERT INTO [AllTimeGreatProgrammersDateBase].dbo.CATEGORIES(NAME )
 VALUES (@NAME );

 SET @CATEGORY_ID = SCOPE_IDENTITY();

 SELECT @CATEGORY_ID;
END

いくつかの問題

  • メソッドから「ref」を使用して返された値を確認する方法
  • テストするのではなく、何をテストしたいですか?リストできれば素晴らしいでしょう
4

2 に答える 2

2

アダプタ タイプの特性に応じて、いくつかのオプションがあります。AddDeveloperCategoryReturnID が仮想またはインターフェイスメンバーである場合、ほとんどの場合、Test Double (手巻きまたは動的モック) を使用して、その動作をテスト固有の動作に置き換えることができます。

非仮想メソッドの場合、次の 2 つのオプションがあります。

  • メソッドをリファクタリングして、テストしやすくします。
  • データベース ラウンドトリップを含む自動テストを記述します。

データベースを含む自動化されたテストは、純粋な単体テストよりも作成と保守が桁違いに難しいため、リファクタリング オプションを選択する傾向があります。

一方、ストアド プロシージャが、自動化されたテストによって保護されるべき貴重なコード資産を表していると考える場合は、データベース テストを作成する以外に手段はありません。

于 2010-01-19T18:36:30.343 に答える
1

Adapter.AddNewBlogCategoryReturnID(categoryName, ref categoryID)最初に、参照によって変数を返すのではなく、単に値を返すように変換します。

次に、それを仮想メソッドに抽出します。

をテストAddNewCatRetIDするには、クラスを拡張してテスト可能なバージョンを作成し、その仮想メソッドをオーバーライドしint?てパブリック変数に格納された を返します。

そうすれば、データベースに 0 がある状況で呼び出したときに何が起こるかをテストするときにAddNewCatRetID、実際にデータベースに 0 を入れる必要はありません。クラスのテスト可能なバージョンにそのパラメーターを設定するだけです。 、そしてテストが を呼び出すときAddNewCatRetID、代わりにデータベースにヒットすると、設定した値が返されます。データベースへのアクセスを回避できれば、テストはより高速であることが保証されます。これは MS によって生成されたアダプターであるため、実際にテストする必要はありません。アダプターが返すものに対してメソッドが何を行うかだけを気にします。

于 2010-01-19T19:14:36.420 に答える