Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq链接表达式导致参数计数不匹配_C#_Asp.net Mvc_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 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

我正在尝试使用Moq模拟存储库。我发现了多个类似问题,但没有一个能解决我的问题

所以我使用的是一个可以下载的存储库。更具体地说,可以查看存储库本身,也可以查看我使用的查询扩展

这就是我的测试设置的外观:

        // 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));