Considerate le seguenti classi:Iniettare Sia interfaccia e implementazione in AutoFixture
public interface IInterface {}
public class Class : IInterface {}
public class Customization : ICustomization
{
readonly IInterface item;
public Customization() : this(new Class()) {}
public Customization(IInterface item)
{
this.item = item;
}
public void Customize(IFixture fixture)
{
fixture.Inject(item);
var created = fixture.Create<Class>(); // Would like this to resolve as item from previous line.
}
}
Il problema che sto funzionando in è che la IInterface
viene iniettata, mentre la Class
non è. C'è un modo per iniettare sia IInterface
e Class
in modo che venga restituita la stessa istanza per entrambi?
Si prega di notare che mi piacerebbe farlo utilizzando un ICustomization
(o all'interno di un ICustomization
) e non con gli attributi su un metodo di prova. Sto cercando di fare un'iniezione personalizzata su queste due classi. Se utilizzo il parametro [Frozen(Matching.ImplementedInterfaces)]Class item
come parametro, non funziona, poiché la Classe che è bloccata sovrascrive il valore iniettato nel metodo ICustomization.Customize
.
Si prega di notare inoltre che questo è un codice di esempio e non come lo sto usando. Nel metodo di prova xUnit, vorrei l'istanza Class
specificato come parametro di essere congelati IInstance
sopra:
public void MyTest(IInterface @interface, Class implementation)
{
Assert.Same(@interface, implementation);
}
Quel sovraccarico di 'Freeze' non fa quello che pensi che faccia; vedere [la documentazione] (https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/FixtureFreezer.cs#L43-L72). Vedi la risposta di Enrico Campidoglio per un modo abbastanza idiomatico di ottenere il risultato desiderato. Un'altra opzione sarebbe quella di utilizzare una delle estensioni del contenitore auto-mocking AutoFixture, che fondamentalmente hanno funzionalità integrate di questo tipo. –
Mi scuso @MarkSeemann, sono fallito. Ho visto l'altra discussione su Inject/Freeze e mi sono confuso. Volevo dire Inject e non Freeze, e ho aggiornato la domanda di conseguenza. –