簡體   English   中英

具有多個簽名的 Moq 規范模式接口實現

[英]Moq Specification Pattern Interface implemenation with multiple signatures

我正在嘗試根據提供的輸入設置兩個不同的模擬對象。

通用接口定義如下:

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; }
}

然后是一個實現 class,它具有三種方法並從中間基礎 class 派生。

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");
    }
}

基本的 mocking 這很簡單:

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

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

沒關系,只要我不在乎得到什么回報並抽象出細節。 但是,我現在確實需要關心這一點。

如何修改It.IsAny<ISpecification<WindFarm>>()以便區分

public WindFarmsSpecification()

public WindFarmsSpecification(string name)

無法明確知道使用了哪個構造函數。 但它可以根據示例構造函數中顯示的內容基於參數中填充的內容來暗示。

捕獲傳遞的參數並根據需要使用

例如

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;
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM