Para garantir que meus mapeamentos do AutoMapper não explodam, tenho uma classe de teste semelhante à seguinte:
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)
}
}
Acabei de descobrir que _fixture.Create(inputType)
não cria realmente uma instância do tipo (por exemplo, Foo
no primeiro teste), mas na verdade uma instância de System.Type
. Isso, é claro, torna meu teste bastante inútil.
Eu examinei os métodos disponíveis (apenas navegando no IntelliSense), mas não consegui encontrar um que parecesse corresponder às minhas expectativas. Existe uma maneira de fazer o que eu quero aqui; basicamente criar uma instância de um tipo fornecido em tempo de execução?
Parece que eu sei o que está acontecendo 😄
Se você tentar o AutoFixture v4 , verá que este código não compila. O motivo é que extraímos sobrecargas de métodos confusos Create()
em um pacote separado, portanto, apenas os usuários que sabem o que estão fazendo devem usá-los.
`` `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);
}
A API provavelmente não é sucinta, no entanto, seu cenário não é comum, então isso deve estar bem.
Deixe-me saber se isso ajudou 😉
Obrigado!
Ao ler o código-fonte do objeto fixture.Create<T>()
genérico, descobrindo onde ele acaba, também descobri que isso funciona:
var input = new SpecimenContext(_fixture).Resolve(sourceType);
Eu acho que eles são mais ou menos equivalentes :) Muito obrigado!
@tlycken Na verdade, ambos os snippets fazem o mesmo, embora sua opção pareça muito melhor :) Irá usá-lo no futuro, se necessário: blush:
Comentários muito úteis
Obrigado!
Ao ler o código-fonte do objeto
fixture.Create<T>()
genérico, descobrindo onde ele acaba, também descobri que isso funciona:Eu acho que eles são mais ou menos equivalentes :) Muito obrigado!