2012-03-20 6 views
4

をテストし、私はユニットテストを持っているので、同じよう:ロジック

[Test] 
    public void DataIn_NoOfRowsReached_CreatesSequentialData() 
    { 
     //Assert 
     MyLogic logic = SetupLogic(); 
     logic.NoOfRows = 3; 

     logic.DataIn(1, "1,4,7"); 
     logic.DataIn(2, "2,5,8"); 
     logic.DataIn(3, "3,6,9"); 

     CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues); 
    } 

それぞれのDATAINコールは、ID(第一のparam)に応じて、別のリストにデータを渡された追加されます。 NoOfRows番号がDataIn入力IDと等しい場合、データは順次にマージされます。私はそれを確認するためにテストします。

私は今、テストケースを使いたいと思いますが、テストメソッドにifステートメントとさまざまなオプションのパラメーターを入れないと簡単にはできません。私は実際にさまざまなシナリオのテストを複製したくありません。

NoOfRowsの最大値は6

+1

を? – sloth

+1

言い換えれば...入力パラメータを取る汎用メソッドを作成し、多数の入力を使ってこの特定のテストを行いたいのですか? – scottheckel

答えて

2

私はこれがあなたが探していると信じています。 params keywordを利用すると、任意の文字列を渡すことができます。

[Test] 
public void DataIn_NoOfRowsReached_CreatesSequentialData() 
{ 
    MyGenericTest("1,4,7", "2,5,8", "3,6,9"); 
} 

private void MyGenericTest(params string[] inputs) 
{ 
    //Assert 
    MyLogic logic = SetupLogic(); 
    logic.NoOfRows = inputs.Length; 

    List<string> allNumbers = new List<string>(); 
    for(int i = 0; i < inputs.Length; i++) 
    { 
     logic.DataIn(i + 1, inputs[i]); 
     allNumbers.AddRange(inputs[i].Split(','); 
    } 

    allNumbers.Sort(); 
    CollectionAssert.AreEqual(allNumbers.Distinct(), logic.ExpectedValues); 
} 

これは単なる文字列はソートん...あなたが9より大きいある数字を持っている場合、あなたはadd your own compare function to the Sort() methodしたいと思います。

+0

私はすべての文字列をint型にキャストして、それをソートすることもうまくいくと思いますか? – Jon

+0

ええ、int.Parse、int.TryParseなどを使用して、好きな変換方法が問題なく動作します。私はあなたがおそらく文字列を必要と思ったので、私はそれを文字列として保管しました。 – scottheckel

+1

ええ、私はあなたが9以上の数に言及するまでやりました! Thanks – Jon

0

あなたには、いくつかの「スマート」のテストを書きたい場合、あなたはおそらく、あなたが入力として入力し、それらを並べ替える番号の予想される配列を作成することができ、あなたが数字を追跡することができますです各行の一部として入力します(数字を使用して文字列を作成します)。それ以外には、私はあまりにも多くの改善を見ません。

1

NUnitを使用していて、入力が異なる複数のテストケースを実行する場合は、値属性http://nunit.com/index.php?p=values&r=2.6を使用できます。

あなたのユニットテストは、次のようになります。あなたが使用しているユニットテストフレームワーク

[Test] 
public void DataIn_NoOfRowsReached_CreatesSequentialData([Values(new[] { "1,4,7", "2,5,8", "3,6,9" }, ...)] string[] vals) 
{ 
    //Assert 
    MyLogic logic = SetupLogic(); 
    logic.NoOfRows = vals.Length; 

    for (var i = 0; i < vals.Length; ++i) 
     logic.DataIn(i + 1, vals[i]); 

    CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues); 
} 
+1

ValuesとTestCasesの違いは何ですか? – Jon

+0

これは考えられていませんでしたが、アイデアのおかげです。 Combinatorial属性と組み合わせてValuesを使用すると、2つ以上の変数がある場合にすべての可能な組み合わせをテストすることができます。一方、TestCase属性を使用すると、特定のテストケースに対してExpectedExceptionを設定できるなど、自由度が増します。シーケンシャルテストケースだけを実行したい場合は、TestCaseでコードを読みやすくすることもできます。私は上記の単体テストにTestCase属性を使用することをお勧めします.-) –