Autofixture: Est-il possible de créer une instance basée sur un runtime « System.Type » ?

Créé le 16 nov. 2017  ·  3Commentaires  ·  Source: AutoFixture/AutoFixture

Pour m'assurer que mes mappages AutoMapper n'explosent pas, j'ai une classe de test similaire à la suivante :

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)
    }
}

Je viens de découvrir que _fixture.Create(inputType) ne crée pas réellement une instance du type (par exemple un Foo dans le premier test) mais en fait une instance de System.Type . Ceci, bien sûr, rend mon test assez inutile.

J'ai parcouru les méthodes disponibles (en parcourant simplement IntelliSense) mais je n'ai pas trouvé celle qui semblait correspondre à mes attentes. Y a-t-il un moyen de faire ce que je veux ici ; créer essentiellement une instance d'un type fourni lors de l'exécution ?

question

Commentaire le plus utile

Merci!

En lisant le code source de l'objet générique fixture.Create<T>() , en déterminant où il finit par finir, j'ai également découvert que cela fonctionnait :

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

Je suppose qu'ils sont plus ou moins équivalents :) Merci beaucoup !

Tous les 3 commentaires

Il semble que je sais ce qui se passe

Si vous essayez AutoFixture v4 , vous constaterez que ce code ne se compile pas. La raison en est que nous avons extrait les surcharges de méthode Create() confuses dans un package séparé, de sorte que seuls les utilisateurs qui savent ce qu'ils font doivent les utiliser.

```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);
}

L'API n'est probablement pas succincte, mais votre scénario n'est pas courant, donc ça devrait aller.

Dis moi si ça a aidé

Merci!

En lisant le code source de l'objet générique fixture.Create<T>() , en déterminant où il finit par finir, j'ai également découvert que cela fonctionnait :

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

Je suppose qu'ils sont plus ou moins équivalents :) Merci beaucoup !

@tlycken En effet, les deux extraits font la même chose, tandis que votre option est bien meilleure :) Je l'utiliserai à l'avenir si nécessaire :blush:

Cette page vous a été utile?
0 / 5 - 0 notes