[英]Mocking a repository call with a Func<T, bool> parameter using Moq
我正在尝试使用Moq来模拟我的某些存储库调用,并且我产生的大多数单元测试都运行良好,但是我遇到了无法正确模拟的情况。
需要模拟的我的存储库调用具有以下签名:
IEnumerable<T> Get(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "");
我正在进行单元测试的方法如下:
public bool CheckForTaskUsage(int taskId)
{
return _taskInstanceRepository.Get(x => x.Task.Id == taskId).Any();
}
单元测试如下:
Task task_1 = new Task() { Id = 1 };
TaskInstance taskInstance_1 = new TaskInstance() { Id = 1, Task = task_1 };
_domainTaskInstances = new List<TaskInstance>() { taskInstance_1 };
[TestMethod()]
public void TaskService_CheckForTaskUsage_Success()
{
int taskId = 1;
//_taskInstanceRepository.Setup(x => x.Get(y => y.Task.Id == taskId,null,""))
// .Returns(_domainTaskInstances);
_taskInstanceRepository.Setup(x => x.Get(null, null, ""))
.Returns(_domainTaskInstances);
bool expected = true;
bool actual;
actual = GetTarget().CheckForTaskUsage(taskId);
Assert.AreEqual(expected, actual);
}
无论如何,由于对CheckForTaskUsage
的调用返回false,因此测试失败,正如您通过应用于Moq设置的_domainTaskInstances
所看到的_domainTaskInstances
,这是不正确的。 我已经逐步完成了代码,它应该可以正常工作,并且可以通过UI正常工作。
然后,我实际上尝试尝试重新创建在CheckForTaskUsage
方法中使用的Func<>
(您可以在单元测试中看到此尝试已被注释掉),即使签名和变量应该相同,这也失败了。
最后,作为测试,我尝试将CheckForTaskUsage
方法的内容修改为以下内容:
return _taskInstanceRepository.Get().Where(x => x.Task.Id == taskId).Any();
这允许测试成功通过,但是我不想更改我的方法代码以允许单元测试通过!
我认为问题在于我需要像尝试的那样重新创建Func<>
参数,但是我不知道我在这里做错了什么,任何建议都会受到欢迎!
谢谢
(ps我知道我没有这里的所有代码(例如某些变量声明等),但是我知道这不是问题,因为该代码已在其他测试中使用并且可以正常工作,这个问题很混乱。)
按照要求:
public TaskService GetTarget()
{
return new TaskService(_taskRepository.Object);
}
我认为您应该这样做:
_taskInstanceRepository
.Setup(x => x.Get(It.IsAny<Expression<Func<TaskInstance, bool>>>(), null, ""))
.Returns(_domainTaskInstances);
您测试的方法没有将null
作为第一个参数filter
,而是给出了Expression<...>
某些实例。
显然,您不能在Setup
表达式中省略可选参数; 因此代码:
_taskInstanceRepository
.Setup(x => x.Get(It.IsAny<Expression<Func<TaskInstance, bool>>>())) // illegal
.Returns(_domainTaskInstances);
这会显得有点更像是在你测试方法的语法,是不允许的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.