web-dev-qa-db-fra.com

Tests paramétrés Nunit avec datetime

Quelqu'un pourrait-il me dire qu'il n'est pas possible avec nunit d'aller:

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

Je veux vraiment mettre un datetime dedans mais ça ne semble pas l'aimer. L'erreur est:

Un argument d'attribut doit être une expression constante, une expression typeof ou une expression de création de tableau d'un type de paramètre d'attribut

Certains documents que j'ai lus semblent suggérer que vous devriez pouvoir, mais je ne trouve aucun exemple.

61
AnonyMouse

J'utiliserais probablement quelque chose comme l'attribut ValueSource pour ce faire

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)
{
}

Cela exécutera la TestMethod pour chaque entrée de la collection _testData

42
Shaun Wilde

C'est une réponse un peu tardive mais, espérons-le, de valeur.

Vous pouvez spécifier la date sous forme de chaîne constante dans l'attribut TestCase, puis spécifier le type sous la forme DateTime dans la signature de la méthode.

NUnit fera automatiquement une DateTime.Parse() sur la chaîne passée.

Exemple:

[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

Une autre alternative consiste à utiliser une approche plus verbeuse. Surtout si je ne sais pas nécessairement à l'avance, quel type de DateTime() (le cas échéant ...) une chaîne donnée donne.

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

... notez que TestCase prend en charge 3 paramètres max.

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

Vous devez utiliser la classe TestCaseData comme indiqué: http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

En plus de spécifier un résultat attendu, comme:

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

Vous pouvez également spécifier les exceptions attendues, etc.:

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

Il semble que NUnit n'autorise pas l'initialisation d'objets non primitifs dans le (s) TestCase (s). Il est préférable d'utiliser TestCaseData .

Votre classe de données de test ressemblerait à ceci:

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);
    }
}

Dans votre classe de test, le test comprendrait un TestCaseSource qui renvoie à vos données de test.

Comment utiliser: TestCaseSource (typeof (le nom de la classe va ici), nameof (le nom de la propriété va ici))

[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