Autofixture: É possível criar uma instância baseada em um runtime `System.Type`?

Criado em 16 nov. 2017  ·  3Comentários  ·  Fonte: AutoFixture/AutoFixture

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?

question

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:

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

Eu acho que eles são mais ou menos equivalentes :) Muito obrigado!

Todos 3 comentários

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:

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

zvirja picture zvirja  ·  3Comentários

zvirja picture zvirja  ·  8Comentários

josh-degraw picture josh-degraw  ·  4Comentários

DeafLight picture DeafLight  ·  5Comentários

joelleortiz picture joelleortiz  ·  4Comentários