es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Arreglos genéricos de colecciones en XUnit.

Una clase genérica de accesorios y soporte:

public class Fixture<T> : IAsyncLifetime, IDisposable {
  public Fixture() { }
  public void Dispose() { }
  public Task InitializeAsync() => Task.CompletedTask;
  public Task DisposeAsync() => Task.CompletedTask;
}

[CollectionDefinition("collection")]
public class FixtureCollection<T> : ICollectionFixture<Fixture<T>> { }

[Collection("collection")]
public abstract class TestBase<T> {
  protected TestBase(Fixture<T> fixture) => _fixture = fixture;
  protected readonly Fixture<T> _fixture;
}

He eliminado algunas partes de estas clases para mostrar un ejemplo mínimo (pero hay “cosas” en ellas).

Y aquí está la clase de prueba:

public class Foo { }

public class Tests : TestBase<Foo> {
  public Tests(Fixture<Foo> fixture) : base(fixture) { }
  [Fact] public void Test1() { }
  [Fact] public void Test2() { }
}

Las pruebas fallan:

Los siguientes parámetros de constructor no tenían datos de accesorios coincidentes: Fixture`1 fixture

Si hago este cambio, entonces funciona, pero no puedo usarlo como accesorio de colección:

cs
//[Collection("collection")] // removido
public abstract class TestBase<T> : IClassFixture<Fixture<T>> { // agregado IClassFixture

Leí la documentación. ¿Se admite este caso de uso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, este caso de uso es compatible con xunit.net. El problema con la prueba fallida es que la clase TestBase no está registrada como una colección de accesorios. Para solucionarlo, puede agregar los atributos CollectionDefinition e ICollectionFixture a la clase TestBase:

    [CollectionDefinition("colección")]
    public class TestCollection : ICollectionFixture<><foo>> { }
    
    [Collection("colección")]
    public abstract class TestBase<t> {
        protected TestBase(Fixture<t> fixture) => _fixture = fixture;
        protected readonly Fixture<t> _fixture;
    }
    

    Luego puede usar TestBase como clase base para sus clases de prueba:

    [Collection("colección")]
    public class Pruebas : TestBase<foo> {
        public Pruebas(Fixture<foo> fixture) : base(fixture) { }
        [Fact] public void Prueba1() { }
        [Fact] public void Prueba2() { }
    }
    

    De esta manera, se creará una instancia de Fixture y se pasará al constructor de TestBase cuando se instancie la clase Pruebas.

Comments are closed.