我是新的moq,并一直在努力与以下。
我已经模拟了一个名为_mockedThingsList的List列表
我想Moq我的IRepository的FindBy基于我正在测试的服务中提供的linq查询从这个模拟列表返回。
我目前有什么抛出异常,如下所示。有什么不对吗?
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();
}
}
答案 0 :(得分:5)
我可能会错过一些背景,但在我看来,你过度嘲笑。嘲笑清单的目的是什么?您可以轻松返回一个具体列表并将其用于测试。
答案 1 :(得分:0)
我的解释可能有问题,但FindBy的签名正在返回IEnumerable。虽然在存根时,你正在返回一个代表。我想由于返回类型不匹配,您将遇到此问题。出于测试目的,为什么不从返回方法返回一些正确的列表,即
(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
.Returns(// return a proper List of type T);
发生了'System.ArgumentException'类型的未处理异常 mscorlib.dll其他信息:对象类型 'System.Func`2 [ThingNamespace.IThing,System.Boolean]'不能 转换为'ThingNamespace.enumThingType'类型
这是事情。在FindBy上声明存根时,您将类型参数指定为:Func。现在在您的Returns方法中,输入参数应该完全相同。请尝试以下代码:
Func<IThing, bool> func => (IThing thing) => thing.ThingType == tp;
(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
.Returns((func) => _mockedThingsList.Where(func));