Рассмотрим следующие классы:Вводят Оба интерфейса и реализации в 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.
}
}
Проблема Я бегу в том, что IInterface
впрыскивается, в то время как Class
нет. Есть ли способ вставить как IInterface
, так и Class
, чтобы тот же экземпляр был возвращен для обоих?
Обратите внимание, что я хотел бы сделать это, используя ICustomization
(или в пределах ICustomization
), а не с атрибутами тестового метода. Я ищу, чтобы сделать индивидуальные инъекции на этих двух классах. Если я использую [Frozen(Matching.ImplementedInterfaces)]Class item
в качестве параметра, он не работает, так как класс, который является Frozen, перезаписывает введенное значение в методе ICustomization.Customize
.
Обратите внимание, что это пример кода, а не как я его использую. В методике испытаний XUnit, я хотел бы Class
экземпляр, указанный в качестве параметра будет замороженный IInstance
выше:
public void MyTest(IInterface @interface, Class implementation)
{
Assert.Same(@interface, implementation);
}
Эта перегрузка 'Freeze' не делает то, что вы думаете, что она делает; см. [документация] (https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/FixtureFreezer.cs#L43-L72). См. Ответ Энрико Кампидоглио для одного довольно идиоматического способа достижения желаемого результата. Другим вариантом было бы использование одного из расширений Auto-mocking для AutoFixture, которые в основном имеют встроенные функции. –
Извинения @MarkSeemann, я терплю неудачу. Я видел другую дискуссию о Inject/Freeze и запутался. Я имел в виду Inject, а не Freeze, и обновил вопрос соответствующим образом. –