Чтобы убедиться, что мои сопоставления 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), но не нашел ни одного, который, казалось бы, соответствовал моим ожиданиям. Есть ли здесь способ делать то, что я хочу? в основном создать экземпляр типа, предоставляемого во время выполнения?
Кажется, я знаю, что происходит 😄
Если вы попробуете 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:
Самый полезный комментарий
Спасибо!
Прочитав исходный код универсального объекта
fixture.Create<T>()
, выяснив, где он в конечном итоге окажется, я также обнаружил, что это работает:Думаю, они более или менее эквивалентны :) Большое спасибо!