Реализация шаблона спецификации Moq с несколькими сигнатурами - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь настроить два разных макетированных объекта на основе предоставленных входных данных.

Общие определения интерфейса следующие:

public interface ISpecification<T>
{
    Expression<Func<T, bool>> Criteria { get; }
    List<Expression<Func<T, object>>> Includes { get; }
    List<string> IncludeStrings { get; }
    Expression<Func<T, object>> OrderBy { get; }
    Expression<Func<T, object>> OrderByDescending { get; }

    int Take { get; }
    int Skip { get; }
    bool IsPagingEnabled { get; }
}

Затем реализующий класс, имеющий три методаи происходит от промежуточного базового класса.

public sealed class WindFarmsSpecification : BaseSpecification<WindFarm>
{
    public WindFarmsSpecification()
        : base(null)
    {
        this.AddInclude("Submissions");
        this.ApplyOrderBy(s => s.Name);
    }

    public WindFarmsSpecification(string name)
        : base(s => s.Name.Contains(name))
    {
        this.AddInclude("Submissions");
        this.ApplyOrderBy(s => s.Name);
    }

    public WindFarmsSpecification(Guid guidId)
        : base(s => s.GuidId == guidId)
    {
        this.AddInclude("Submissions");
    }
}

Базовая проверка этого проста как:

mock.Setup(m => m.ListAsync(It.IsAny<ISpecification<WindFarm>>()))
            .Returns(() =>
            {
                var windFarms = new List<WindFarm>
                {
                    testWindFarm1
                };

                return Task.FromResult((IReadOnlyList<WindFarm>)windFarms);
            });

Что в порядке, пока мне все равно, что получить возврати абстрагируется от деталей. Однако теперь мне нужно позаботиться об этом.

Как мне изменить moq It.IsAny<ISpecification<WindFarm>>(), чтобы я мог различать

public WindFarmsSpecification()

и

public WindFarmsSpecification(string name)

1 Ответ

1 голос
/ 06 ноября 2019

Не представляется возможным точно узнать, какой конструктор использовался. Но это может подразумеваться на основе того, что заполняется в параметре в соответствии с тем, что было показано в конструкторах примера.

Захват переданного параметра и использование при необходимости

Например

mock
    .Setup(_ => _.ListAsync(It.IsAny<ISpecification<WindFarm>>()))
    .ReturnsAsync((ISpecification<WindFarm> spec) => {
        //access passed argument
        var criteria = spec.Criteria;

        //use expression to filter a mock list            
        var result = somelist.Where(criteria).OrderBy(spec.OrderBy).ToList();    

        return (IReadOnlyList<WindFarm>)result;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...