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 ?
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:
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 :Je suppose qu'ils sont plus ou moins équivalents :) Merci beaucoup !