У меня есть объектную модель, которая использует Open Generics (Да, да, теперь у меня есть две проблемы, вот почему я здесь :): -AutoFixture: Настройка Open Дженерики ОБРАЗЦОВ Builder
public interface IOGF<T>
{
}
class C
{
}
class D
{
readonly IOGF<C> _ogf;
public D(IOGF<C> ogf)
{
_ogf = ogf;
}
}
Я m пытается получить AutoFixture для генерации анонимных экземпляров D
выше. Тем не менее, сама по себе, AutoFixture не имеет встроенной в стратегии построения IOGF<>
и, следовательно, мы наблюдаем:
public class OpenGenericsBinderDemo
{
[Fact]
public void X()
{
var fixture = new Fixture();
Assert.Throws<Ploeh.AutoFixture.ObjectCreationException>(() =>
fixture.CreateAnonymous<D>());
}
Основополагающее сообщение:
Ploeh.AutoFixture.ObjectCreationException: AutoFixture был не удалось создать экземпляр из IOGF`1 [C], скорее всего, потому, что он не имеет открытого конструктора, является абстрактным или непубличным.
Я рад предоставить ему конкретную реализацию:
public class OGF<T> : IOGF<T>
{
public OGF(IX x)
{
}
}
public interface IX
{
}
public class X : IX
{
}
и связанный с обязательными:
fixture.Register<IX,X>();
Как (или я должен даже взглянуть на проблему, что путь ??) сделать следующий тестовый проход?
public class OpenGenericsLearning
{
[Fact]
public void OpenGenericsDontGetResolved()
{
var fixture = new Fixture();
fixture.Inject<IX>(fixture.Freeze<X>());
// TODO register or do something that will provide
// OGF<C> to fulfill D's IOGF<C> requirement
Assert.NotNull(fixture.CreateAnonymous<D>());
}
}
(Есть обсуждения и вопросы, связанные с этим на сайте CodePlex - я просто нужно быстро осущ этого и я открыт для удаления этого, если это просто плохая идея, и/или я что-то пропустил)
РЕДАКТИРОВАТЬ 2: (См. Также комментарий к ответу Марка). Контекст (по общему признанию, придуманный) здесь является приемочным тестом на большом «почти полном» системном графике объекта «Система под тестом», а не на небольшом (контролируемом/:) пара или триплет классов в единичном или интеграционном тестовом сценарии. Как упоминалось в заявлении о скором вопросе, я не совсем уверен, что этот тип теста даже имеет смысл.
AutoMoq, AutoRhinoMocks и AutoFakeItEasy являются расширениями, которые позволяют использовать AutoFixture как авто-насмешливый контейнера. Это вариант? (Потому что таким образом вы можете успешно создать анонимный экземпляр D.) –
@Nikos Знает расширения автомодели и мысленно исключил их - shoud упомянули об этом; см. мои комментарии к отвечу Марка для получения дополнительной информации). Принимая этот комментарий вместе с ответом Марка на сердце, я буду удваивать свои усилия, чтобы не полагаться на мой костыль! –
related: http://stackoverflow.com/questions/20209469/how-can-i-register-a-generic-object-factory –