Autofixture: Ist es möglich, eine Instanz basierend auf einer Laufzeit `System.Type` zu ​​erstellen?

Erstellt am 16. Nov. 2017  ·  3Kommentare  ·  Quelle: AutoFixture/AutoFixture

Um sicherzustellen, dass meine AutoMapper-Zuordnungen nicht explodieren, habe ich eine Testklasse ähnlich der folgenden:

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

Ich habe gerade entdeckt, dass _fixture.Create(inputType) eigentlich keine Instanz des Typs erstellt (zB ein Foo im ersten Test), sondern tatsächlich eine Instanz von System.Type . Das macht meinen Test natürlich ziemlich nutzlos.

Ich habe die verfügbaren Methoden durchgesehen (nur IntelliSense durchsucht), konnte aber keine finden, die meinen Erwartungen zu entsprechen schien. Gibt es eine Möglichkeit hier zu tun, was ich will? grundsätzlich eine Instanz eines zur Laufzeit bereitgestellten Typs erstellen?

question

Hilfreichster Kommentar

Vielen Dank!

Durch das Lesen des Quellcodes des generischen fixture.Create<T>() Objekts, um herauszufinden, wo es schließlich landet, habe ich auch herausgefunden, dass dies funktioniert:

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

Ich denke, sie sind mehr oder weniger gleichwertig :) Vielen Dank!

Alle 3 Kommentare

Es scheint, dass ich weiß, was los ist 😄

Wenn Sie AutoFixture v4 ausprobieren , werden Sie feststellen, dass dieser Code nicht kompiliert wird. Der Grund dafür ist, dass wir verwirrende Create() Methodenüberladungen in ein separates Paket

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

API ist wahrscheinlich nicht prägnant, Ihr Szenario ist jedoch nicht üblich, also sollte das in Ordnung sein.

Lass mich wissen ob das geholfen hat 😉

Vielen Dank!

Durch das Lesen des Quellcodes des generischen fixture.Create<T>() Objekts, um herauszufinden, wo es schließlich landet, habe ich auch herausgefunden, dass dies funktioniert:

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

Ich denke, sie sind mehr oder weniger gleichwertig :) Vielen Dank!

@tlycken Tatsächlich machen beide Snippets dasselbe, während Ihre Option viel besser aussieht :) Werde sie in Zukunft bei Bedarf verwenden :blush:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mjfreelancing picture mjfreelancing  ·  4Kommentare

JoshKeegan picture JoshKeegan  ·  6Kommentare

Ephasme picture Ephasme  ·  3Kommentare

zvirja picture zvirja  ·  3Kommentare

zvirja picture zvirja  ·  8Kommentare