3

いくつかの機能についていくつかの単体テストを作成するように求められましたが、率直に言って、この特定のコードに対して作成する必要性や有用性についてはよくわかりません。私は、一般的な単体テストの必要性や有用性に疑問を投げかけているわけではありません。

問題のコードは非常に些細なもので、よく使われます。基本的には、.Skip()および.Take()拡張メソッドのラッパーです。私の意見では、方法全体の正当性には疑問があります。

コードは基本的にこれです:

public IQueryable<T> Page(IQueryable<T> query, int page, int size)
{
    if(query == null) throw new ArgumentNullException("query");
    if(page < 0) throw new ArgumentOutOfRangeException("page"); 
    if(page < 0) throw new ArgumentOutOfRangeException("size"); 

    return query.Skip(page * size).Take(size);
}

もちろん、予想される例外の単体テストはできますが、他に何がありますか?私が要点を見逃している可能性が非常に高いので、これはどうしたのですか?

4

4 に答える 4

3

を呼び出すことで静的コレクションを渡すことができますAsQueryable

List<T> dummyData = new List<T>();
//Add data
var result = Page(dummyData.AsQueryable(), 0, 10);
//Perform assertions on result.

実際には、ページネーションが正しく機能することをテストしようとしているだけです。

于 2012-12-03T15:28:59.000 に答える
2

ここでかなりの数のことをテストできます。

  1. 適切なガード(無効なパラメーターが渡されたときにスローされる例外)を確認します。
  2. Skip正しいパラメーターで呼び出されたことを確認してください。
  3. Take正しいパラメーターで呼び出されたことを確認してください。
  4. Skip以前に呼び出されたことを確認してくださいTake

ポイント2〜4は、モックでテストするのが最適です。ここでは、モックフレームワークが役立ちます。
この種のテストは「相互作用ベースのテスト」と呼ばれます。

また、データを含むリストを使用してテスト対象のメソッドを呼び出し、返されたデータが正しいサブセットであることを確認することで、「状態ベースのテスト」を使用することもできます。

ポイント2のテストは次のようになります。

public void PageSkipsThePagesBeforeTheRequestedPage()
{
    var sut = new YourClass();
    var queryable = Substitute.For<IQueryable<int>>();

    sut.Page(queryable, 10, 50);

    queryable.Received().Skip(500);
}

このテストでは、モックフレームワークとしてNSubstituteを使用します。

于 2012-12-03T15:30:55.870 に答える
0

実際、IQueryable<T>基盤となるデータストレージをカプセル化する可​​能性があるため(Entity Frameworkのクエリ可能ファイルの場合)、統合テストについて話します。

私の場合、コードのようなものをテストする必要がある場合は、後でクエリを実行できるように、テストデータをデータベースに保存します。

結果を期待できるので、テストしたメソッドが期待した結果を返したかどうかを確認するためにアサーションを実行できます。

アップデート

反対票とコメントに混乱が見られるので、回答がEntity Frameworkのタグ付けされていることを考慮してこれに回答したことを指摘しておきます。また、クエリ可能ファイルはから取得されたと思いDbSetます。

于 2012-12-03T15:27:59.967 に答える
0

確かに、この方法をテストする必要性は非常に高いです。まず第一に、バグのために:

if(page < 0) throw new ArgumentOutOfRangeException("page"); 
if(page < 0) throw new ArgumentOutOfRangeException("size"); 

実際には、サイズ変数をチェックしていません。

とにかく、「統合」テストを実行する必要はありません。IQueryableオブジェクトをモックして、単体テストを実行するだけです。(この回答を参照してください:IQueryable <T>をモックする方法)私の意見では、このメソッドをテストすることは絶対に正しいことです。

于 2012-12-03T15:35:10.683 に答える