Estoy escribiendo algunas pruebas de unidad para la capa de persistencia de mi aplicación C# .NET. Antes y después de que se ejecuten las pruebas de una clase de prueba, quiero hacer algo de limpieza para borrar los valores ficticios posiblemente insertados, por lo tanto, esta limpieza ocurre en los métodos marcados con los atributos [ClassInitialize()]
y [ClassCleanup()]
.Cómo escribir la salida en [ClassInitialize()] de una clase Unit Test?
(Sé que una mejor manera sería utilizar una base de datos en memoria, pero no es realmente factible la medida en que dependemos de una gran cantidad de procedimientos almacenados ....)
lo haría al igual que a mostrado información sobre los resultados de la limpieza hasta, pero no puedo encontrar una manera de obtener la salida de los resultados de las pruebas con Visual Studio 2010.
Esto es lo que estoy haciendo hasta ahora:
///... lots of stuff before ...
//global for the test run
private static TestContext context;
//for each test
private IRepository repo;
#region Initialisation and cleanup
/// <summary>
/// Execute once before the test-suite
/// </summary>
[ClassInitialize()]
public static void InitTestSuite(TestContext testContext)
{
context = testContext;
removeTestDataFromDb();
}
[ClassCleanup()]
public static void CleanupTestSuite()
{
removeTestDataFromDb();
}
private static void removeTestDataFromDb()
{
context.WriteLine("removeTestDataFromDb starting");
using (ISession session = NHibernateHelper.OpenSession())
{
IDbConnection cn = session.Connection;
IDbCommand cmd = cn.CreateCommand();
//remove anyt test data
cmd.CommandText = @"DELETE FROM SomeTable
WHERE somefield LIKE 'easyToFindTestData%Test'";
int res = cmd.ExecuteNonQuery();
context.WriteLine("removeTestDataFromDb done - affected {0} rows", res);
}
}
[TestInitialize()]
public void InitTest()
{
repo = new MyRepositoryImplementation();
}
[TestCleanup()]
public void CleanupTest()
{
//cleanup
repo = null;
}
#endregion
estoy tratando de utilizar context.WriteLine() ...
que también trató simplemente usando Console.WriteLine() con los mismos resultados.
¿Cómo se escribe en la salida estándar en la parte ClassInitialize
y dónde se puede acceder a esa salida?
Gracias por su consejo Steven, pero en realidad prefieren realice la limpieza solo una vez por clase, en realidad. Y como estoy usando NHibernate, no estoy muy seguro sobre el uso de TransactionScope ... Sin embargo, lo echaré un vistazo. De todos modos, esto realmente no responde mi pregunta acerca de cómo escribir en la salida :-) – tsimbalar
No limpiar una vez por clase. Las pruebas deben ejecutarse de forma aislada, y cuando no se limpian los datos de prueba por prueba, la prueba depende uno del otro, lo que los hace poco confiables. Cuando deja de confiar en sus pruebas, se vuelven inútiles. por cierto. 'TransactionScope' funciona bien con NHibernate, porque NHibernate solo usa conexiones estándar ADO.NET. Además, cuando escribe en la consola en [TestCleanup] no tendrá este problema, pero por favor no escriba en la consola, simplemente revertir. – Steven
Gracias, no sabía de TransactionScope ... ¡parece exactamente lo que necesito! No estoy seguro de entender lo que sucede debajo del capó, sin embargo ... Confía en MSDTC por lo que puedo ver ... ¡Gracias de nuevo! – tsimbalar