【发布时间】:2014-09-03 08:05:07
【问题描述】:
我正在尝试使用 Moq 模拟存储库。我发现了多个具有类似问题的问题,但我发现没有一个能够解决我遇到的问题。
所以我正在使用可以下载的存储库here。更具体地说,可以查看存储库本身 here 并且可以查看我正在使用的查询扩展 here。
这是我的测试设置的样子:
// A List<> of fakes.
this.containers = Builder<Container>.CreateListOfSize(10).Build();
// Here I'm trying to set up the mock object for the query.
this.containerRepoMock.Setup(p => p.
Query(It.IsAny<Expression<Func<Container, bool>>>())
.Include(It.IsAny<Expression<Func<Container, object>>>())
.Select())
.Returns((Expression<Func<Container, bool>> query, Expression<Func<Container, object>> include) =>
this.containers.AsQueryable().Where(query).Include(include));
// Tell the service to use the mock repository.
this.containerService = new ContainerService(mockUnitOfWork.Object);
这是我要测试的服务方法:
public ContainerDto GetContainerAndItsCategories(int containerId)
{
var entity = Repository
.Query(w => w.ContainerId == containerId)
.Include(c => c.Categories)
.Select();
var output = Mapper.EntityToDto(entity.SingleOrDefault());
return output;
}
每当我尝试使用模拟存储库在我的测试中运行此服务方法时,它都会引发异常“System.Reflection.TargetParameterCountException:参数计数不匹配。”
我尝试在模拟设置中向 .Returns() 方法添加额外的对象参数,但没有成功。它总是抛出相同的异常。从我一直在阅读的内容来看,在测试表达式方面,起订量有些有限,但是我看到了人们成功地做类似事情的例子。
由于 Include() 和 Query() 方法返回 IQueryFluent() 实例而不是直接表达式,我尝试在 Moq return() 方法中使用 QueryFluent() 类,但未能成功带有可查询(编译错误)。
任何帮助将不胜感激,真的希望能够使用单元测试正确测试。
编辑 - 我看过的类似问题
【问题讨论】:
-
虽然写得很好,但你的问题需要我做大量的工作才能归结为问题陈述。下次尝试创建一个更好的SSCCE,以便更快地得到答案。
-
我试图让它变得简单,但也试图包含可能相关的信息。猜猜我做得过火了。感谢您不厌其烦地调查它。今天晚些时候我会试试你的解决方案。
-
不用担心,它完成了工作。祝你好运!
标签: c# asp.net-mvc unit-testing mocking moq