C# Moq链接表达式导致参数计数不匹配
我正在尝试使用Moq模拟存储库。我发现了多个类似问题,但没有一个能解决我的问题 所以我使用的是一个可以下载的存储库。更具体地说,可以查看存储库本身,也可以查看我使用的查询扩展 这就是我的测试设置的外观:C# Moq链接表达式导致参数计数不匹配,c#,asp.net-mvc,unit-testing,mocking,moq,C#,Asp.net Mvc,Unit Testing,Mocking,Moq,我正在尝试使用Moq模拟存储库。我发现了多个类似问题,但没有一个能解决我的问题 所以我使用的是一个可以下载的存储库。更具体地说,可以查看存储库本身,也可以查看我使用的查询扩展 这就是我的测试设置的外观: // A List<> of fakes. this.containers = Builder<Container>.CreateListOfSize(10).Build(); // Here I'm trying to
// 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);
每当我尝试在使用模拟存储库的测试中运行此服务方法时,它都会抛出一个异常“System.Reflection.TargetParameterCountException:参数计数不匹配”
我尝试在模拟设置中向.Returns()方法添加额外的对象参数,但没有成功。它总是抛出相同的异常。从我一直阅读的内容来看,当涉及到测试表达式时,Moq有点有限,但是我看到了一些例子,人们成功地做了类似的事情
由于Include()和Query()方法返回的是IQueryFluent()实例,而不是直接表达式,因此我尝试在Moq return()方法中使用QueryFluent()类,但未能成功地使用queryable(编译错误)
任何帮助都将不胜感激,我真的希望能够使用单元测试正确地测试这一点
编辑-我看过的类似问题
- 问题在于这一行:
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));
您告诉Moq(在设置
调用中)使用两个参数(查询
和包含
)调用单个方法,并将它们传递给返回
lambda。显然情况并非如此:您调用了两个单参数方法,因此Moq抛出了一个参数不匹配异常
您需要将其分解为组件,并为返回值设置模拟。此外,由于要使用表达式
对象,因此需要将这些对象保存下来,以便在最后使用。例如:
var containerRepoMock = new Mock<IRepositoryAsync<Container>>();
var queryFluentQueryMock = new Mock<IQueryFluent<Container>>();
var queryFluentIncludeMock = new Mock<IQueryFluent<Container>>();
Expression<Func<Container, bool>> query = null;
containerRepoMock.Setup(p => p.Query(It.IsAny<Expression<Func<Container, bool>>>()))
.Callback<Expression<Func<Container, bool>>>(q => query = q)
.Returns(queryFluentQueryMock.Object);
Expression<Func<Container, object>> include = null;
queryFluentQueryMock.Setup(p => p.Include(It.IsAny<Expression<Func<Container, object>>>()))
.Callback<Expression<Func<Container, object>>>(i => include = i)
.Returns(queryFluentIncludeMock.Object);
queryFluentIncludeMock.Setup(p => p.Select())
.Returns(containers.AsQueryable().Where(query).Include(include));
var containerRepoMock=new Mock();
var queryFluentQueryMock=new Mock();
var queryfluenticludemock=new Mock();
表达式查询=null;
containerRepoMock.Setup(p=>p.Query(It.IsAny()))
.Callback(q=>query=q)
.Returns(queryFluentQueryMock.Object);
表达式include=null;
queryFluentQueryMock.Setup(p=>p.Include(It.IsAny()))
.Callback(i=>include=i)
.Returns(queryfluentcludemock.Object);
queryFluentIncludeMock.Setup(p=>p.Select())
.Returns(containers.AsQueryable().Where(query).Include(Include));
请原谅任何编译错误,我没有下载您链接到的库来尝试这一点虽然写得很好,但您的问题需要我付出大量的努力才能归结为一个问题陈述。下一次尝试创建一个更好的答案,以便更快地得到答案。我试图使它变得简单,但也尝试包含可能相关的信息。我想我做得太过分了。谢谢你费心调查此事。今天晚些时候我会试试你的解决方案。不用担心,它完成了任务。祝你好运测试将运行,但要执行此操作,我必须在定义表达式时设置表达式(否则会出现编译器错误“在访问之前可能未初始化局部变量”)。因此,containerRepoMock和queryFluentQueryMock上的Setup()似乎无法正确运行。至少他们没有替换预设的表达式。你知道可能遗漏了什么吗?我不知道他们为什么不工作。不幸的是,我将在几周内无法调试。如果你明白了,请回来评论!
var containerRepoMock = new Mock<IRepositoryAsync<Container>>();
var queryFluentQueryMock = new Mock<IQueryFluent<Container>>();
var queryFluentIncludeMock = new Mock<IQueryFluent<Container>>();
Expression<Func<Container, bool>> query = null;
containerRepoMock.Setup(p => p.Query(It.IsAny<Expression<Func<Container, bool>>>()))
.Callback<Expression<Func<Container, bool>>>(q => query = q)
.Returns(queryFluentQueryMock.Object);
Expression<Func<Container, object>> include = null;
queryFluentQueryMock.Setup(p => p.Include(It.IsAny<Expression<Func<Container, object>>>()))
.Callback<Expression<Func<Container, object>>>(i => include = i)
.Returns(queryFluentIncludeMock.Object);
queryFluentIncludeMock.Setup(p => p.Select())
.Returns(containers.AsQueryable().Where(query).Include(include));