У меня есть простая абстрактная фабрика, возвращающая простой тип. По сути, он просто заполняет тип данными и возвращает их, как в 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 свойства, вместо использования подделки, написанной вручную. Однако я не могу понять, как заставить его возвращать значения, которые передаются в качестве параметров в поддельную фабрику.

Можно ли это сделать или мне нужно каждый раз использовать подделку с ручным кодом?

0
NightOwl888 20 Авг 2014 в 23:18

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 возвращать новую инструкцию каждый раз, когда она вызывается. Если вы хотите вернуть тот же экземпляр или , если вы хотите выполнить некоторые утверждения в инструкции позже, вам придется переместить объявление из делегата.

5
dcastro 21 Авг 2014 в 00:31
Вам не хватает закрывающей круглой скобки, но в остальном она работает.
 – 
NightOwl888
21 Авг 2014 в 00:30
Спасибо, исправлено;)
 – 
dcastro
21 Авг 2014 в 00:31
Спасатель! :) Спасибо!
 – 
Lightning3
6 Июн 2017 в 14:46