У меня есть простая абстрактная фабрика, возвращающая простой тип. По сути, он просто заполняет тип данными и возвращает их, как в DTO.
public interface IPagingInstructionFactory
{
IPagingInstruction Create(int skip, int take, IProvider provider);
}
public interface IPagingInstruction
{
int Skip { get; }
int Take { get; }
IProvider Provider { get; }
}
Теперь я хочу создать фиктивную фабрику, которая в основном делает то же самое, что и реальная - которая передает параметры из метода Create () и возвращает их из свойств экземпляра IPagingInstruction.
Вот пример, который работает:
var pagingInstructionFactory = new Mock<IPagingInstructionFactory>();
pagingInstructionFactory
.Setup(x => x.Create(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<IProvider>()))
.Returns((int skip, int take, IProvider provider) =>
new FakePagingInstruction(skip, take, provider));
public class FakePagingInstruction
: IPagingInstruction
{
public FakePagingInstruction(
int skip,
int take,
IProvider provider
)
{
if (provider == null)
throw new ArgumentNullException("provider");
this.skip = skip;
this.take = take;
this.provider = provider;
}
private readonly int skip;
private readonly int take;
private readonly IProvider provider;
public int Skip
{
get { return this.skip; }
}
public int Take
{
get { return this.take; }
}
public IProvider Provider
{
get { return this.provider; }
}
}
Мне кажется, что Moq должен иметь возможность создавать поддельный объект, который может возвращать все 3 свойства, вместо использования подделки, написанной вручную. Однако я не могу понять, как заставить его возвращать значения, которые передаются в качестве параметров в поддельную фабрику.
Можно ли это сделать или мне нужно каждый раз использовать подделку с ручным кодом?
1 ответ
Вы имеете в виду что-то вроде этого?
var pagingInstructionFactory = new Mock<IPagingInstructionFactory>();
this.pagingInstructionFactory
.Setup(x => x.Create(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<IProvider>()))
.Returns((int skip, int take, IProvider provider) =>
{
var instruction = new Mock<IPagingInstruction>();
instruction.Setup(i => i.Skip).Returns(skip);
instruction.Setup(i => i.Take).Returns(take);
instruction.Setup(i => i.Provider).Returns(provider);
return instruction.Object;
});
Это заставит Create
возвращать новую инструкцию каждый раз, когда она вызывается. Если вы хотите вернуть тот же экземпляр или , если вы хотите выполнить некоторые утверждения в инструкции позже, вам придется переместить объявление из делегата.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.