2012-09-12 8 views
18

Estoy intentando configurar mis pruebas con Xunit. Tengo un requisito para eliminar todas las imágenes en un inicio de carpeta de las pruebas, y luego cada método hace un cambio de tamaño de imagen y guarda una copia de su salida a la carpeta. La carpeta solo debe vaciarse una vez, y luego cada método guardará su propia imagen en la carpeta.Cómo ejecutar el código de configuración solo una vez en una prueba de xUnit.net

Cuando uso IUseFixture<T>, todavía se está llamando a la función ClearVisualTestResultFolder antes de cada prueba, por lo que solo termino con una imagen en la carpeta.

public class Fixture 
{ 
    public void Setup() 
    { 
     ImageHelperTest.ClearVisualTestResultFolder(); 
    } 
} 

public class ImageHelperTest : IUseFixture<EngDev.Test.Fixture> 
{ 
    public void SetFixture(EngDev.Test.Fixture data) 
    { 
     data.Setup(); 
    } 

    public static void ClearVisualTestResultFolder() 
    { 
     // Logic to clear folder 
    } 
} 

Si pongo la ClearVisualTestResultFolder en el constructor, que es también ser llamado una vez para todos los métodos de prueba. Necesito que esto solo se ejecute una vez antes de que se ejecuten todos los métodos de prueba, ¿cómo puedo lograr esto?

Si es importante, uso el corrector de prueba ReSharper.

Respuesta

25

Siguiendo la guía en este xUnit discussion topic, parece que necesita implementar un constructor en el dispositivo y también implementar IDisposable. He aquí una muestra completa que se comporta de la manera deseada:

using System; 
using System.Diagnostics; 
using Xunit; 
using Xunit.Sdk; 

namespace xUnitSample 
{ 
    public class SomeFixture : IDisposable 
    { 
     public SomeFixture() 
     { 
      Console.WriteLine("SomeFixture ctor: This should only be run once"); 
     } 

     public void SomeMethod() 
     { 
      Console.WriteLine("SomeFixture::SomeMethod()"); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("SomeFixture: Disposing SomeFixture"); 
     } 
    } 

    public class TestSample : IUseFixture<SomeFixture>, IDisposable 
    { 
     public void SetFixture(SomeFixture data) 
     { 
      Console.WriteLine("TestSample::SetFixture(): Calling SomeMethod"); 
      data.SomeMethod(); 
     } 

     public TestSample() 
     { 
      Console.WriteLine("This should be run once before every test " + DateTime.Now.Ticks); 
     } 

     [Fact] 
     public void Test1() 
     { 
      Console.WriteLine("This is test one."); 
     } 

     [Fact] 
     public void Test2() 
     { 
      Console.WriteLine("This is test two."); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("Disposing"); 
     } 
    } 
} 

Cuando se ejecuta esto desde el corredor de la consola, verá el siguiente resultado:

D: \ xUnit> xunit.console.clr4 .exe test.dll/html foo.htm xUnit.net corrector de prueba de la consola (.NET 4.0.30319.17929 de 64 bits) Copyright (C) 2007-11 Microsoft Corporation.

xunit.dll: Versión 1.9.1.1600 Equipo de prueba: test.dll

SomeFixture ctor: Esto sólo se debe ejecutar una vez

pruebas completo: 2 de 2

SomeFixture: Eliminación SomeFixture

total de 2, 0 no, 0 omitidos, tomó 0.686 segundos

Luego, cuando abre el archivo de salida de prueba foo.htm, verá la otra salida de prueba.

6

IUseFixture<T>.SetFixture recibe una llamada para cada prueba. El accesorio en sí mismo solo se crea una vez.

En otras palabras, no deberías estar haciendo nada en tu método SetFixture, pero en su lugar deberías desencadenarlo en el constructor Fixture.

Para la limpieza de una sola vez, implementar una IDisposable.Dispose en el accesorio (no se requiere sin embargo)

Tenga en cuenta que es una mala idea estar (incluso potencialmente) estado de uso compartido entre las pruebas. Es mejor utilizar un TemporaryDirectoryFixturelike this one.

11

La antigua interfaz IUseFixture<T> en v1 xUnit.net.x ha sido reemplazado por dos nuevas interfaces: IClassFixture<T> y ICollectionFixture<T>. En además, el mecanismo para inyectar valores de fijación en sus pruebas ha cambiado de los establecedores de propiedad a los argumentos de constructor. Los accesorios de la clase se crean una vez y se comparten entre todas las pruebas en la misma clase (muy similar a la antigua IUseFixture). Los accesorios de la colección funcionan de la misma manera, excepto que la instancia única se comparte entre todas las pruebas en la misma colección de prueba.

Cuestiones relacionadas