web-dev-qa-db-ja.com

日時を使用したNunitパラメーター化テスト

誰かが私に行くことは不可能だと言うことができます:

[TestCase(new DateTime(2010,7,8), true)]
public void My Test(DateTime startdate, bool expectedResult)
{
    ...
}

私は本当にそこにdatetimeを入れたいのですが、それが好きではないようです。エラーは次のとおりです。

属性引数は、定数式、typeof式、または属性パラメーター型の配列作成式である必要があります

私が読んだいくつかのドキュメントは、あなたができるべきだと示唆しているようですが、私は例を見つけることができません。

56
AnonyMouse

これを行うには、おそらく ValueSource 属性のようなものを使用します

public class TestData
{
    public DateTime StartDate{ get; set; }
    public bool ExpectedResult{ get; set; }
}

private static TestData[] _testData = new[]{
    new TestData(){StartDate= new DateTime(2010,7,8), ExpectedResult= true}};

[Test]
public void TestMethod([ValueSource("_testData")]TestData testData)
{
}

これにより、_testDataコレクションの各エントリに対してTestMethodが実行されます

42
Shaun Wilde

これは少し遅い回答ですが、うまくいけば価値があります。

TestCase属性で日付を定数文字列として指定し、メソッドシグネチャでDateTimeとしてタイプを指定できます。

NUnitは渡された文字列に対してDateTime.Parse()を自動的に実行します。

例:

[TestCase("01/20/2012")]
[TestCase("2012-1-20")] //same case as above in ISO format
public void TestDate(DateTime dt)
{
    Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20)));
}
117
RonnBlack

別の選択肢は、より冗長なアプローチを使用することです。特に、前もってわからない場合、与えられた文字列入力がどのようなDateTime()(もしあれば...)を生成するかを知りません。

[TestCase(2015, 2, 23)]
[TestCase(2015, 12, 3)]
public void ShouldCheckSomething(int year, int month, int day)
{
    var theDate = new DateTime(year,month,day);
    ....
} 

...注TestCaseは最大3つのパラメーターをサポートしているため、さらに必要な場合は、次のようなものを検討してください。

private readonly object[] testCaseInput =
{
    new object[] { 2000, 1, 1, true, "first", true },
    new object[] { 2000, 1, 1, false, "second", false }
}

[Test, TestCaseSource("testCaseInput")]
public void Should_check_stuff(int y, int m, int d, bool condition, string theString, bool result)
{
....
}
7
Caad9

文書化されているTestCaseDataクラスを使用する必要があります。 http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

次のような期待される結果を指定することに加えて:

 new TestCaseData( 12, 4 ).Returns( 3 );

予想される例外などを指定することもできます。

 new TestCaseData( 0, 0 )
    .Throws(typeof(DivideByZeroException))
    .SetName("DivideByZero")
    .SetDescription("An exception is expected");
7
Doguhan Uluca

NUnitはTestCase内の非プリミティブオブジェクトの初期化を許可していないようです。 TestCaseData を使用するのが最適です。

テストデータクラスは次のようになります。

public class DateTimeTestData
{
    public static IEnumerable GetDateTimeTestData()
    {
        // If you want past days.
        yield return new TestCaseData(DateTime.Now.AddDays(-1)).Returns(false);
        // If you want current time.
        yield return new TestCaseData(DateTime.Now).Returns(true);
        // If you want future days.
        yield return new TestCaseData(DateTime.Now.AddDays(1)).Returns(true);
    }
}

テストクラスには、テストデータを指定する TestCaseSource をテストに含める必要があります。

使用方法:TestCaseSource(typeof(class name goes here)、nameof(name of property does here))

[Test, TestCaseSource(typeof(DateTimeTestData), nameof(GetDateTimeTestData))]
public bool GetDateTime_GivenDateTime_ReturnsBoolean()
{
    // Arrange - Done in your TestCaseSource

    // Act
    // Method name goes here.

    // Assert
    // You just return the result of the method as this test uses ExpectedResult.
}
3
AzzamAziz