2016-12-09 3 views
1

Я очень новичок в AutoFixture, и у меня есть некоторые проблемы, которые пытаются динамически замораживать и вводить типы. Вот пример кода, который я имел, что я повторял повсюду, чтобы получить поддельные хранилища впрыскиваются в мой арматуре:Автопринадлежности и динамический тип приспособления Инъекции

FakeRepository<Application> applicationRepository = fixture.Freeze<FakeRepository<Application>>(); 
fixture.Inject<IReadRepository<Application>>(applicationRepository); 
fixture.Inject<IWriteRepository<Application>>(applicationRepository); 

После получения всех типов в сборке объекта динамически с помощью отражения, я хотел бы чтобы сделать что-то вроде этого:

Type repositoryReadInterfaceType = typeof(IReadRepository<>).MakeGenericType(entityType); 
Type repositoryWriteInterfaceType = typeof(IWriteRepository<>).MakeGenericType(entityType); 
Type repositoryType = typeof(FakeRepository<>).MakeGenericType(entityType); 

var repositoryObject = fixture.Freeze(repositoryType); 
fixture.Inject(repositoryReadInterfaceType, repositoryObject); 
fixture.Inject(repositoryWriteInterfaceType, repositoryObject); 

Однако, нет перегрузок, которые поддерживают желаемые инъекции, которые я бы хотел. Есть ли другой способ обойти это, что я пропал? Или, возможно, это просто невозможно?

Edit для того, что я пробовал:

Попытка 1 с помощью TypeRelay:

var repositoryObject = fixture.Freeze(repositoryType); 

fixture.Customizations.Add(new TypeRelay(repositoryReadInterfaceType, repositoryType)); 
fixture.Customizations.Add(new TypeRelay(repositoryWriteInterfaceType, repositoryType)); 

Попытка 2 с помощью SpecimenBuilderNodeFactory:

var repositoryObject = fixture.Freeze(repositoryType); 

fixture.Customizations.Insert(
    0, 
    SpecimenBuilderNodeFactory.CreateTypedNode(
     repositoryReadInterfaceType, 
     new FixedBuilder(repositoryObject) 
    ) 
); 
fixture.Customizations.Insert(
    0, 
    SpecimenBuilderNodeFactory.CreateTypedNode(
     repositoryWriteInterfaceType, 
     new FixedBuilder(repositoryObject) 
    ) 
); 

Покушение 3 дзю улица с использованием динамического Замораживания:

В отдельном методе с помощью отражения, я замораживание всех поддельных хранилищ, как так:

var repositoryObject = fixture.Freeze(repositoryType); 

Тогда в моем основном методе я инъекционное чтение и записях типов репозитория вручную :

fixture.Inject<IReadRepository<Application>>(fixture.Create<FakeRepository<Application>>()); 
fixture.Inject<IWriteRepository<Application>>(fixture.Create<FakeRepository<Application>>()); 

Все вышеперечисленные попытки привести к чтения и записи типов кажущихся не указывают на то же FakeRepository.

ответ

1

Обновленный ответ, оригинальный дальше

Это репрографии работы (на тесты проходит):

public interface IFoo 
{ 
    string FooIt(); 
} 

public interface IBar 
{ 
    string BarIt(); 
} 

public class FooBar : IFoo, IBar 
{ 
    public FooBar(Guid id) 
    { 
     this.Id = id; 
    } 

    public Guid Id { get; private set; } 

    public string BarIt() 
    { 
     return this.Id.ToString(); 
    } 

    public string FooIt() 
    { 
     return this.Id.ToString(); 
    } 
} 

public class Tests 
{ 
    [Fact] 
    public void AllIsFrozen() 
    { 
     var fixture = new Fixture(); 
     fixture.Customize(new FreezingCustomization(typeof(FooBar))); 
     fixture.Customizations.Add(new TypeRelay(typeof(IFoo), typeof(FooBar))); 
     fixture.Customizations.Add(new TypeRelay(typeof(IBar), typeof(FooBar))); 

     var foo = fixture.Create<IFoo>(); 
     var bar = fixture.Create<IBar>(); 
     var foobar = fixture.Create<FooBar>(); 

     Assert.Equal(foobar.Id.ToString(), foo.FooIt()); 
     Assert.Equal(foobar.Id.ToString(), bar.BarIt()); 
    } 
} 

Оригинальный ответ

Я не пробовал , поэтому он не может компилироваться, не работать ...

Все, что вы вводите, в конечном итоге упаковывается в ISpecimenBuilder и помещается в Fixture.Customizations. Вы можете попытаться использовать FixedBuilder и упаковать его в типизированный узел.

Что-то подобное может работать:

fixture.Customizations.Insert(
    0, 
    SpecimenBuilderNodeFactory.CreateTypedNode(
     myType, 
     new FixedBuilder(myObject))); 

Вы также можете использовать Customizations.Add, но учтите, что порядок в том, что вопросы, сбора (первый матч выигрывает).

+0

Благодарим вас за ответ! Я выстрелил, и это, похоже, не сработало.По какой-то причине хранилища Write и Read, похоже, не указывают на тот же FakeRepository. Я также дал TypeRelay выстрел, но это дало мне те же результаты. – AnonAll112

+0

@ AnonAll112 О, да, я забыл про 'TypeRelay's. Те должны работать. Можете ли вы поделиться тем, что вы пробовали? –

+0

Я обновил свое оригинальное сообщение с помощью двух блоков кода, которые я пробовал. – AnonAll112

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