2012-06-29 2 views
6

は、私は次のことを持っていると言う:TestCaseを使用してNunit内のオブジェクトに対して異なるアクションメソッドのリストを実行する方法はありますか?

[Test] 
    // would like to parameterize the parameters in call AND the call itself 
    public void Test() 
    { 
     var res1 = _sut.Method1(1); 
     var res2 = _sut.Method2("test"); 
     var res3 = _sit.Method3(3); 

     Assert.That(res1, Is.Null); 
     Assert.That(res2, Is.Null); 
     Assert.That(res3, Is.Null); 
    } 

私はコール自体を含むテストケース/ TestCaseSource属性を使用してテストをパラメータ化したいと思います。反復的なテストのため、それぞれのメソッドをわずかに異なるパラメータで呼び出す必要がありますが、異なるパラメータごとに異なる呼び出しをタグ付けできる必要があります。これはNunitでも可能ですか?もしそうなら、私はどうすればそれについて行きますか?

+0

こんにちは。私はこれがMbUnitを使って簡単に可能であることを知っています... NUnitを使って、DBを使用してこのDBに値を格納し、次にデータソースを使ってテストをパラメータ化することができると思います – Kek

答えて

5

、あなたは値の配列をループすることができなければならないし、このような、例えば、所望のメソッドを呼び出す:_sutインスタンスはTestClassコンストラクタでインスタンス化される必要があること

[TestFixture] 
public class TestClass 
{ 
    private Sut _sut; 

    public TestClass() 
    { 
    _sut = new Sut(...); 
    } 

    private IEnumerable<object> TestCases 
    { 
    get 
    { 
     var values = new object[,] { { 1, "test", 3 }, { 2, "hello", 0 }, ... }; 

     for (var i = 0; i < values.GetLength(0); ++i) 
     { 
      yield return _sut.Method1((int)values[i,0]); 
      yield return _sut.Method2((string)values[i,1]); 
      yield return _sut.Method3((int)values[i,2]); 
     } 
    } 
    } 

    [TestCaseSource("TestCases")] 
    public void Test(object val) 
    { 
    Assert.That(val, Is.Null); 
    } 
} 

注意。 [SetUp]または[TestFixtureSetUp]の方法で初期化するだけでは不十分です。場合

あなたはコンストラクタでSutインスタンスのコレクションを作成し、TestCasesゲッターのforループ内の関連Sut項目にアクセスすることができ、異なるメソッド呼び出しのために異なる_sutインスタンスを必要としています。または、ゲッターのすべてのSutアイテムをループすることもできます。

+0

興味深い提案ですが、 '式の型'λ式を変換して型Tuple を生成することはできません。オブジェクト> ... – jaffa

+0

例を更新しましたが、コードをより深く見ていきます。できるだけ早く戻ってきます。 –

+0

私はそれを初めて過ぎました:-)更新された例はどうですか? –

0

Afaikでは、NUnitにそのような組み込みのメカニズムはありません。しかし、テストに複数のメソッドが存在する場合は、別々のテストに分割する方がよいと思います。

あなたは常に同じオブジェクト(_sut)でこれらのメソッドを呼び出すのであれば、これを反映させることができます(オーバーヘッドのオーバーヘッドを取ることに決めた場合も同様です)。例えば

、あなたのTestCaseSourceで、及び試験方法で文字列パラメータを追加するには、このようにそれを呼び出す:あなたはパラメータ化するそれぞれの方法が異なる数を取るとき

Type type = _sut.GetType(); 
MethodInfo methodInfo = type.GetMethod(methodName); 
object result = methodInfo.Invoke(_sut, null); 

物事が急速に複雑になります議論だ。デバッグとどのテストが失敗したかを見ることは、もっと難しくなります。これらのテストを分割できるのが最善です。 TestCaseSource使用

+0

嬉しいですが、 。私はそれを減らしました。各テストの行は、ヘルパーメソッドを作成することで、テストを繰り返しても悪くないようにします。しかし、私はこの種のものが状態マシンなどのテストに役立つと思います... – jaffa

関連する問題