Autofixture: Можно ли создать экземпляр на основе среды выполнения `System.Type`?

Созданный на 16 нояб. 2017  ·  3Комментарии  ·  Источник: AutoFixture/AutoFixture

Чтобы убедиться, что мои сопоставления AutoMapper не взорвутся, у меня есть тестовый класс, подобный следующему:

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

Я только что обнаружил, что _fixture.Create(inputType) самом деле создает не экземпляр типа (например, Foo в первом тесте), а фактически экземпляр System.Type . Это, конечно, делает мой тест бесполезным.

Я просмотрел доступные методы (просто просматривая IntelliSense), но не нашел ни одного, который, казалось бы, соответствовал моим ожиданиям. Есть ли здесь способ делать то, что я хочу? в основном создать экземпляр типа, предоставляемого во время выполнения?

question

Самый полезный комментарий

Спасибо!

Прочитав исходный код универсального объекта fixture.Create<T>() , выяснив, где он в конечном итоге окажется, я также обнаружил, что это работает:

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

Думаю, они более или менее эквивалентны :) Большое спасибо!

Все 3 Комментарий

Кажется, я знаю, что происходит 😄

Если вы попробуете AutoFixture v4 , вы обнаружите, что этот код не компилируется. Причина в том, что мы извлекли запутанные перегрузки методов Create() в отдельный пакет, поэтому их должны использовать только те пользователи, которые знают, что они делают.

`` С #
_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, вероятно, не лаконичен, однако ваш сценарий не является распространенным, так что это должно быть хорошо.

Сообщите мне, помогло ли это 😉

Спасибо!

Прочитав исходный код универсального объекта fixture.Create<T>() , выяснив, где он в конечном итоге окажется, я также обнаружил, что это работает:

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

Думаю, они более или менее эквивалентны :) Большое спасибо!

@tlycken Действительно, оба фрагмента делают то же самое, но ваш вариант выглядит намного лучше :) Будем использовать его в будущем, если потребуется: blush:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

JoshKeegan picture JoshKeegan  ·  6Комментарии

Ephasme picture Ephasme  ·  3Комментарии

Ridermansb picture Ridermansb  ·  4Комментарии

Accc99 picture Accc99  ·  4Комментарии

zvirja picture zvirja  ·  8Комментарии