使用Func<>设置FindBy方法的最小存储库
本文关键字:存储 方法 FindBy Func 设置 使用 | 更新日期: 2023-09-27 18:15:21
我是新手,一直在努力解决以下问题。
我模拟了一个名为_mockedThingsList的list列表
我想Moq我的IRepository的FindBy,以根据我正在测试的服务中提供的linq查询从这个mock列表返回。
我当前的代码抛出了一个异常,如下所示。请问出什么事了?
mock.Setup(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
.Returns((enumThingType tp) => _mockedThingsList.Where(x => x.ThingType == tp));
存储库接口如下:
interface IRepository<T>
{
IEnumerable<T> FindAll();
IEnumerable<T> FindBy(Func<T, bool> predicate);
void Add(T item);
void Remove(T item);
bool Contains(T item);
int Count { get; }
}
和将使用这个模拟
进行测试的服务class ThingService
{
private readonly IRepository<IThing> _repository;
public ThingService(IRepository<IThing> repository)
{
_repository = repository;
}
public List<IThing> GetThings1()
{
return _repository.FindBy(y => y.ThingType == enumThingType.WhatEver).ToList();
}
public List<IThing> GetThings2()
{
return _repository.FindBy(y => y.Name == "What ever").ToList();
}
}
我可能错过了一些上下文,但在我看来,你是过度嘲笑。嘲弄这个列表的目的是什么?您可以很容易地返回一个具体的列表,并将其用于您的测试。
我的解释可能是错误的,但是FindBy的签名返回一个IEnumerable。而在stub时,你会返回一个委托。我猜由于这种不匹配的返回类型,你面临这个问题。出于测试的目的,为什么不直接从return方法返回一些适当的列表,例如
(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
.Returns(// return a proper List of type T);
事情是这样的。当您在FindBy上声明存根时,您将类型参数指定为:Func。现在,在您的Returns方法中,输入参数应该是完全相同的类型。试试下面的代码:类型为"System"的未处理异常。ArgumentException'发生在mscorlib.dll附加信息:对象类型"System.Func"2 [ThingNamespace.IThing、系统。'不能是转换为"thingnamespaces . enumthingtype"类型
Func<IThing, bool> func => (IThing thing) => thing.ThingType == tp;
(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
.Returns((func) => _mockedThingsList.Where(func));