2016-12-09 5 views
1

Ich bin sehr neu in AutoFixture und habe einige Probleme beim dynamischen Einfrieren und Einspritzen von Typen. Hier ist ein Beispiel für den Code, den ich hatte, dass ich ganz über dem Platz wiederholte gefälschte Repositories in meine Halterung injiziert werden:AutoFixture und dynamischer Fixture-Typ Injektionen

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

Nachdem alle Typen in der Entity-Baugruppe dynamisch mit Reflexion bekommen, würde Ich mag So etwas zu tun:

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

Allerdings gibt es keine Überlastungen, die die gewünschten Injektionen unterstützen, die ich möchte. Gibt es noch eine andere Möglichkeit, die ich vermisse? Oder ist das vielleicht nicht möglich?

Bearbeiten für das, was ich versucht habe:

Versuch 1 mit TypeRelay:

var repositoryObject = fixture.Freeze(repositoryType); 

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

Versuch 2 mit 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) 
    ) 
); 

Versuch 3 von ju st mit dynamischem Freezing:

In einem separaten Verfahren Reflexion mit, ich mag so all die falschen Repositories am Einfrieren:

var repositoryObject = fixture.Freeze(repositoryType); 

Da ist in meiner Haupt-Methode, die ich die Lese am injizierende und Repositorytypen manuell schreiben :

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

Alle oben genannten Versuche in das Leseergebnis und Typen schreiben nicht an der gleichen FakeRepository schien zu zeigen.

Antwort

1

aktualisiert Antwort, ursprünglich weiter unten

Diese Reproarbeiten (die Tests bestanden):

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

Ursprüngliche Antwort

Ich habe nicht versucht , so kann es weder kompilieren noch arbeiten ...

Alles, was Sie injizieren, wird schließlich in eine ISpecimenBuilder verpackt und in Fixture.Customizations platziert. Sie könnten versuchen, eine FixedBuilder zu verwenden und diese in einen typisierten Knoten zu packen.

So etwas wie dies funktionieren könnte:

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

Sie auch Customizations.Add verwenden könnte, aber beachten Sie, dass die Reihenfolge, in dieser Sammlung Angelegenheiten (das erste Spiel gewinnt).

+0

Vielen Dank für die Antwort! Ich gab es eine Chance und es schien nicht zu funktionieren.Aus irgendeinem Grund scheinen die Schreib- und Lese-Repositories nicht auf das gleiche FakeRepository zu zeigen. Ich gab der TypeRelay auch eine Aufnahme, aber das gab mir die gleichen Ergebnisse. – AnonAll112

+0

@ AnonAll112 Oh, ja, ich hatte 'TypeRelay's vergessen. Das sollte funktionieren. Kannst du teilen, was du versucht hast? –

+0

Ich habe meinen ursprünglichen Beitrag mit den 2 Code-Blöcken, die ich ausprobiert habe, aktualisiert. – AnonAll112