visual unit test studio gui ejemplo unit-testing nunit

unit-testing - studio - unit test c# ejemplo



Pruebas parametrizadas de Nunit con datetime (5)

Debe usar la clase TestCaseData como se documenta: http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

Además de especificar un resultado esperado, como:

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

También puede especificar excepciones esperadas, etc:

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

Alguien podría decirme si no es posible con nunit ir:

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

Tengo muchas ganas de poner un datetime allí pero no parece gustarle. El error es:

Un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo

Algunos documentos que leí parecen sugerir que deberías poder hacerlo, pero no puedo encontrar ningún ejemplo.


Esta es una respuesta un poco tardía, pero con suerte de valor.

Puede especificar la fecha como una cadena constante en el atributo TestCase y luego especificar el tipo como DateTime en la firma del método.

NUnit hará automáticamente un DateTime.Parse() en la cadena pasada.

Ejemplo:

[TestCase("01/20/2012")] public void TestDate(DateTime dt) { Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20))); }


Otra alternativa es utilizar un enfoque más detallado. Especialmente si no necesariamente sé por adelantado, qué tipo de DateTime() (si existe ...) produce una entrada de cadena determinada.

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

... nota TestCase admite un máximo de 3 parámetros por lo que necesita más, considere algo como:

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


Parece que NUnit no permite la inicialización de objetos no primitivos en los TestCase (s). Es mejor usar TestCaseData .

Su clase de datos de prueba se vería así:

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

En su clase de prueba, la prueba incluye un TestCaseSource que se dirige a sus datos de prueba.

Cómo utilizar: TestCaseSource (typeof (el nombre de la clase va aquí), nameof (el nombre de la propiedad va aquí))

[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. }


Probablemente usaría algo como el atributo ValueSource para hacer esto

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

Esto ejecutará el TestMethod para cada entrada en la colección _testData