2017-10-30 19 views
1

C#、Nunit 3を使用する。TestCaseDataのテストケース引数を変更する方法Nunit

私のテストの多くは共有するテストケースのソースがあります。以下のような 何か:

public static IEnumerable TestCaseSourceMethod() 
{ 
    foreach (String str in someMethodHere) 
    { 
     //do some stuff 
     yield return new TestCaseData(newString).SetCategory(testCategory); 
    } 
} 

そして私は今、私はTestCaseSourceMethodから同じデータを使用しますが、追加のテスト引数を必要とすべき新しい試験方法を、持っている

[Test, TestCaseSource("TestCaseSourceMethod")] 
... 

などのテストで使用します。

私のような何かを思い付いた:私は期待返された値、またはtcd.SetCategory("aaaaa");を変更するためにtcd.Returns("aaa");を行うことができるが、私はテストを変更する方法を見つけることができませんでした

foreach (TestCaseData tcd in TestCaseSourceMethod()) 
{ 
    //how to change tcd to include new test case argument, or create new test case data based on tcd 
    yield return newtcd; 
} 

大文字小文字の引数自体。

+0


名前は、元の1が行うのと同じ場所からデータを描画し、あなたの修正を行い、新たなテストケースのソースメソッドを作成します。 – Nkosi

答えて

3

共通ロジックを独自の方法でいつでも移動して再利用できます。

public static IEnumerable TestCaseSourceMethod() 
{ 
    foreach (String str in someMethodHere) 
    { 
     var newString = DoSomeStaff(str); 
     yield return new TestCaseData(newString).SetCategory(testCategory); 
    } 
} 

public static IEnumerable SpecialTestCaseSourceMethod() 
{ 
    foreach (String str in someMethodHere) 
    { 
     var newString = DoSomeStaff(str); 
     var otherArgument = GetOtherArgument(); 
     yield return new TestCaseData(newString, otherArgument).SetCategory(testCategory); 
    } 
} 
その後、別のアプローチを は、いくつかのものを行うと、テスト

public static string DoSomeStaff(string someValue) 
{ 
    // do some stuff 
    return newString; 
} 

のためのパラメータを返すメソッドを作成します - 余分な引数を持つ新しいTestCaseDataを返す拡張メソッドを作成します。テストが並行して実行される場合は、TestCaseDataの新しいインスタンスを返すことが重要です。

public static TestCaseData AddArguments(this TestCaseData source, params object[] args) 
{ 
    var arguments = source.Arguments.Concat(args).ToArray(); 
    return new TestCaseData(arguments); 
} 

そして特殊なケース

public static IEnumerable SpecialTestCaseSourceMethod() 
{ 
    foreach (var testcase in TestCaseSourceMethod()) 
    { 
     yield return testcase.AddArguments(otherArgument, extraArgument); 
    } 
} 

あなたはAddArgumentsメソッド内で、元のテストケースからカテゴリをコピーすることができますを生成する方法でそれを使用しています。
前述のように、テストを並列に実行すると問題が発生する可能性があるため、テストケースデータのインスタンスを別々にするとよいでしょう。方法AddArguments

public static TestCaseData AddArguments(this TestCaseData source, params object[] args) 
{ 
    var arguments = source.Arguments.Concat(args).ToArray(); 
    var category = source.Properties.Get(PropertyNames.Category).ToString(); 
    return new TestCaseData(arguments).SetCategory(category); 
} 
+0

ありがとう!私はそれを最終的に使用します。しかし、私はtcd..Returns( "aaa")を行うことができるので、tcd.AddOneMoreArg( "new")を行うことができない理由は見当たりません。これが可能であれば、私はむしろこのオプションを使用したいと思います。 – Jeni

+0

@Jeni、あなたはいつも独自の拡張メソッドを作成することができます - 更新された答えを確認してください – Fabio

+0

OK!これは私が探しているもののほぼ100%に見えます。私の唯一の問題は、元のTestCaseDataの他のプロパティを失うということです。上記の私のコード例では、これはCategoryです。これを透過的にソースからコピーする方法はありますか?カテゴリ、期待される結果などを明示的に1つずつ指定する必要があります。 – Jeni

関連する問題