Rozważmy następujące klasy:wstrzyknąć Zarówno interfejs i implementacja w 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.
}
}
Problem używam na to, że IInterface
jest wstrzykiwany, podczas gdy Class
nie jest. Czy istnieje sposób na wstrzyknięcie zarówno IInterface
, jak i Class
, aby zwrócić tę samą instancję dla obu?
Proszę zauważyć, że chciałbym to zrobić przy użyciu ICustomization
(lub w ramach ICustomization
), a nie z atrybutami metody testowej. Szukam zrobienia dostosowanego wtrysku na tych dwóch klasach. Jeśli użyję parametru [Frozen(Matching.ImplementedInterfaces)]Class item
jako parametru, to nie zadziała, ponieważ klasa, która jest zamrożona, zastępuje wprowadzoną wartość w metodzie ICustomization.Customize
.
Należy również pamiętać, że jest to przykładowy kod, a nie sposób, w jaki go używam. W metodzie badania xUnit chciałbym instancję Class
który jest określony jako parametr być zamrożone IInstance
powyżej:
public void MyTest(IInterface @interface, Class implementation)
{
Assert.Same(@interface, implementation);
}
To przeciążenie 'Freeze' nie robi tego, co myślisz, że robi; patrz [dokumentacja] (https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/FixtureFreezer.cs#L43-L72). Zobacz odpowiedź Enrico Campidoglio na jeden dość idiomatyczny sposób osiągnięcia pożądanego rezultatu. Inną opcją byłoby użycie jednego z auto-szyderczych rozszerzeń kontenerów AutoFixture, które w zasadzie mają wbudowane takie funkcje. –
Przepraszam @MarkSeemann, nie udaje mi się. Widziałem drugą dyskusję na temat Inject/Freeze i wpadłem w zakłopotanie. Miałem na myśli Inject, a nie Freeze i odpowiednio zaktualizowałem pytanie. –