2011-11-17 16 views
9

私は単位テストを使用することを学んでいます、私はプロジェクトを作成し、xunitの参照を追加します。 とコードを次なぜxunitはパラメータを持つメソッドをテストできないのですか?

namespace UnitTestProject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [Fact] 
     private void test(int number1, string number2) 
     { 

      int result = number1 + Convert.ToInt32(number2); 
      Assert.IsType(Type.GetType("Int32"), result); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

私はxUnitのGUIツールを使用してテストを実行すると、それは言った:

UnitTestProject.Form1.test:System.InvalidOperationExceptionが:ファクト 方法UnitTestProject.Form1.testができません 於Xunit.Sdk.FactCommand.Execute(TestClassをオブジェクト)
Xunit.Sdk.FixtureCommand.Execute(TestClassをオブジェクト)
Xunit.Sdk.BeforeAfterCommand.Execute(TestClassをオブジェクト):パラメータスタックトレースを持っています Xunit.Sdk.LifetimeCommand.Execute(TestClassをオブジェクト)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(TestClassをオブジェクト)

だから、どのように私は、パラメータを持つメソッド/機能をテストすることができますか?

答えて

18

でもあなたが[Theory]代わりの[Fact]を使用することができます。これにより、異なるパラメータでテストメソッドを作成することができます。 など。

[Theory] 
[InlineData(1, "22")] 
[InlineData(-1, "23")] 
[InlineData(0, "-25")] 
public void test(int number1, string number2) 
{ 
    int result = number1 + Convert.ToInt32(number2); 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

p.s. xUnitでは、テストメソッドを公開する方が良いでしょう。

+0

ありがとう、しかし、私はランダムな値でInlineDataを設定することはできますか?あるいは、InlineDataはインラインメソッド/変数を受け入れますか? – Cheung

+0

あなたはそうすることはできません。以下の汚れた例を見てください。 – Alina

+1

@Shiba通常、テストではランダムな値を使うべきではありません。あなたの例の方法では、乱数が1つ失敗した場合、問題の原因となった数字が何であるか分かりません。テストを決定的に行い、予期せぬ、予想外の、極端な入力の範囲でフィードを作成してください。 – DaveShaw

2

xunitは引数の値として何を供給すればよいでしょうか?単体テストは、データを含む環境を設定し、必要なアクションを実行し、結果が期待どおりであることを主張する自己完結型テストである必要があります。あなたのテストは、number1number2の外部値に依存しているため、自己完結型ではありません。次のことを試してみてください。

[Fact] 
private void TestAdd() { 
    //arrange 
    int number1 = 10; 
    string number2 = "10"; 

    //act 
    object result = Add(number1,number2); 

    //assert 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

private object Add(int number1, string number2) 
{ 
    return number1 + Convert.ToInt32(number2); 
} 

あなたは(パラメータ化ユニットテスト)をやろうとしているか、注意すべき何かが可能ですPexツール

+0

ありがとう。しかし今日、多くのアプリケーションがエンドユーザーと対話しています。たとえば、私の仕事は、ほとんどが勘定システム、在庫システムでの作業を好きです。私はユーザーの入力データを想定できません。私はそれに新しい、まだユニットテストの価値を見つける。 – Cheung

+2

関数は特定のデータ範囲を受け入れる必要があります。典型的には、その範囲のオイラー、例外的なケース、そしてその範囲内の何かを(正気のために)テストします。しかし、Pexをチェックアウトすると、あなたの関数をテストするための入力データが生成されます – flipchart

+0

ありがとう、それは私が望むPexのようです。 – Cheung

14

テストでのランダムな値とインラインメソッド/変数について。 このコードは、テスト用に100個のランダムなint/stringペアを生成します。

[Theory] 
    [PropertyData("GetTestData")] 
    public void test(int number1, string number2) 
    { 

     int result = number1 + Convert.ToInt32(number2); 
     var expectedType = Type.GetType("System.Int32"); 
     Assert.IsType(expectedType, result); 
    } 

    public static IEnumerable<object[]> GetTestData 
    { 
     get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); } 
    } 

    private static object[] GenerateTestData() 
    { 
     var rand = new Random(0); 
     return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()}; 
    } 
+0

ありがとうございました! – Cheung

+0

ようこそ。 – Alina

+0

しかし、なぜですか?失敗した場合は再現できません。あなたのテストでそれらを修正したら、あなたのセットをランダムな値で生成してください。 –

関連する問題