Autofixture: ¿Es posible crear una instancia basada en un `System.Type` en tiempo de ejecución?

Creado en 16 nov. 2017  ·  3Comentarios  ·  Fuente: AutoFixture/AutoFixture

Para asegurarme de que mis asignaciones de AutoMapper no exploten, tengo una clase de prueba similar a la siguiente:

public class MapperTests
{
    private readonly IMapper _mapper; // from AutoMapper
    private readonly IFixture _fixture;

    public MapperTests()
    {
        _mapper = SetUpAutoMapper();
        _fixture = new Fixture();
    }

    [Theory]
    [InlineData(typeof(Foo), typeof(Bar))]
    [InlineData(typeof(Boo), typeof(Far))]
    // etc ...
    public void CanMapTypes(Type inputType, Type outputType)
    {
        var input = _fixture.Create(inputType);

        // throws exceptions if something's broken:
        _mapper.Map(input, outputType)
    }
}

Acabo de descubrir que _fixture.Create(inputType) realidad no crea una instancia del tipo (por ejemplo, una Foo en la primera prueba) sino en realidad una instancia de System.Type . Esto, por supuesto, hace que mi prueba sea bastante inútil.

Revisé los métodos disponibles (solo navegando por IntelliSense) pero no pude encontrar uno que pareciera cumplir con mis expectativas. ¿Hay alguna manera de hacer lo que quiero aquí? básicamente crear una instancia de un tipo proporcionado en tiempo de ejecución?

question

Comentario más útil

¡Gracias!

Al leer el código fuente del objeto genérico fixture.Create<T>() , y averiguar dónde termina finalmente, también descubrí que esto funciona:

var input = new SpecimenContext(_fixture).Resolve(sourceType);

Supongo que son más o menos equivalentes :) ¡Muchas gracias!

Todos 3 comentarios

Parece que sé lo que está pasando 😄

Si prueba AutoFixture v4 , encontrará que este código no se compila. La razón es que extrajimos las confusas sobrecargas del método Create() en un paquete separado, por lo que solo los usuarios que saben lo que están haciendo deberían usarlos.

`` c #
_fixture.Create (inputType);

It might look that you are making a request of `typeof(Foo)` here, however in reality you are passing this argument as a `seed` and the actual request type is `typeof(Type)`.  To fix the issue please tune a bit your code:

```c#
public class Foo
{
}

[Theory]
[InlineData(typeof(Foo))]
public void TestTypeRequest(Type requestType)
{
    var fixture = new Fixture();
    var result = fixture.Create(requestType, new SpecimenContext(fixture));

    Assert.IsAssignableFrom<Foo>(result);
}

La API probablemente no sea sucinta, sin embargo, su escenario no es común, por lo que debería estar bien.

Déjame saber si eso ayudó 😉

¡Gracias!

Al leer el código fuente del objeto genérico fixture.Create<T>() , y averiguar dónde termina finalmente, también descubrí que esto funciona:

var input = new SpecimenContext(_fixture).Resolve(sourceType);

Supongo que son más o menos equivalentes :) ¡Muchas gracias!

@tlycken De hecho, ambos fragmentos hacen lo mismo, mientras que su opción se ve mucho mejor :) Lo

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ploeh picture ploeh  ·  3Comentarios

TroyHouston picture TroyHouston  ·  6Comentarios

Ridermansb picture Ridermansb  ·  4Comentarios

ecampidoglio picture ecampidoglio  ·  7Comentarios

Ephasme picture Ephasme  ·  3Comentarios