2011-02-15 17 views
14

Tengo un trabajo escolar en el que necesito crear un estilo basado en datos de pruebas NUnit. Utilizando el siguiente código, puedo obtener los datos de la base de datos, pero cada vez que falla una llamada 'Confirmar', la prueba se detiene.C#, NUnit Assert in a Loop

¿Hay alguna forma en que realmente pueda mostrar los resultados del ciclo como seis pruebas diferentes (considerando que tengo seis filas en mi base de datos)?

namespace TestClasses 
{ 
    [TestFixture] 
    public class TestingClass : ConnectionClass 
    { 
     private ProductManagement pm; 

     [TestFixtureSetUp] 
     public void CreateTestClass() 
     { 
      pm = new ProductManagement(); 
     } 

     [TestCase] 
     public void GetProductDetailsTest() 
     { 
      SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection); 
      Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable(); 
      da.Fill(dt); 

      foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows) 
      { 
       if (pm.GetProductById(dr.productId) == null) 
        Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId); 
      } 
     } 
    } 
} 

Básicamente lo que busco es, por NUnit para mostrar 3 pruebas pasaron y 3 no pasaron las pruebas, si es posible! ¡Cualquier ayuda sería muy apreciada, gracias! :)

Respuesta

16

El atributo [TestCaseSource] le permitirá hacer esto. Se puede crear una función que devuelve una lista enumerable de casos de prueba

public IEnumerable<Database1DataSet.GetProductDetailsTestRow> GetTestCases() 
{ 
    SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection); 
    Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable(); 
    da.Fill(dt); 

    foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows) 
    { 
     yield return dr; 
    } 
} 

entonces puede pasar de un TestCaseSource en:

[Test, TestCaseSource("GetTestCases")] 
    public void GetProductDetailsTest(Database1DataSet.GetProductDetailsTestRow dr) 
    { 
     if (pm.GetProductById(dr.productId) == null) 
      Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId); 
     } 
    } 
+0

Thats Cool! ¡Está disponible en NUnit 2.5.3, es hora de actualizar! – Jonathan

+0

Probé el mismo enfoque, pero sigo obteniendo un error de referencia nula. Aquí está la pregunta que publiqué en Stackoverflow: http://stackoverflow.com/questions/28624270/c-sharp-nunit-using-testcasesource-results-in-nullpointer – sparkr

3

puede hacer esto usando las pruebas controladas por datos en nunit, pero no estoy seguro de que pueda hacerlo con los datos que provienen de la base de datos. algo a lo largo de las líneas de:

[TestFixture] 
public class RowTestSample 
{ 
    [RowTest] 
    [Row(1)] 
    [Row(2)] 
    [Row(3)] 
    [Row(4)] 
    [Row(5)] 
    [Row(6)] 
    public void GetProductById(int productId) 
    { 
      Assert.That(pm.GetProductById(productId),Is.Not.Null); 
    } 
} 

donde los valores en Row(n) son los identificadores de productos que desea probar. Esto se mostrará como 6 pruebas, cada una con un valor diferente.

No estoy seguro si estos pueden provenir de la base de datos, pero probablemente esto no sea bueno para hacer en la prueba de todos modos.

No estoy seguro del valor de estas pruebas tampoco, supongo que depende de lo que esté haciendo ProductManager.

2

Junto con la extensión RowTest como se sugiere por Sam Holder también puede utilizar la TestCaseAttribute para esto:

[TestFixture] 
public class TestCaseSample 
{  
    [TestCase(1)] 
    [TestCase(2)] 
    [TestCase(3)] 
    [TestCase(4)] 
    [TestCase(5)] 
    [TestCase(6)] 
    public void GetProductById(int productId) 
    {   
     Assert.That(pm.GetProductById(productId),Is.Not.Null); 
    } 
}