c# - 具有多个签名的 Moq 规范模式接口实现
问题描述
我正在尝试根据提供的输入设置两个不同的模拟对象。
通用接口定义如下:
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);
});
没关系,只要我不在乎得到什么回报并抽象出细节。但是,我现在确实需要关心这一点。
如何修改最小起订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;
});
推荐阅读
- php - 删除多个产品的“添加到购物车”按钮
- r - 统计 20 天内的病例数
- node.js - 如何在dockerfile中放置双&符号
- javascript - Javascript Object.entries()
- javascript - 使用 localstorage Redux + Next.js 加载初始状态
- javascript - 为什么 [null, undefined, []] == ",," 返回 true
- docker - 未配置 SMTP,请检查您的 grafana.ini 配置文件的 [smtp] 部分
- python-3.x - Python:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引
- python - 有没有办法在安装过程中修复 ReadTimed out 错误?
- database - 如何计算 PostgreSQL 数据库中特定用户(和相关对象)的存储空间(以字节为单位)?