Mocking NSSubstitute无法确定在“运行项目的所有测试”时要使用的参数规范

Mocking NSSubstitute无法确定在“运行项目的所有测试”时要使用的参数规范,mocking,nsubstitute,Mocking,Nsubstitute,我有一个测试方法: public class MyTests { [Fact] public void Test_Method() { // Arrange var returns = Result.Ok(new List<string>() { "Test" }.AsEnumerable()); this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(returns

我有一个测试方法:

public class MyTests
{
  [Fact]
  public void Test_Method()
  {
     // Arrange 
     var returns = Result.Ok(new List<string>() { "Test" }.AsEnumerable());  

     this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(returns); //returns Result<IEnumerable<string>>


     //Act
     var actResult = this.anotherService.Backup();

     //Assert
     Assert.True(actResult.Success);
  }
  ...
当我只为
Test\u method()
运行该方法时,一切正常。当我尝试运行整个
MyTests
类时,我在这个refere方法上得到以下错误:

NSSubstitute.Exceptions.AmbiguousArgumentsException:'无法确定 要使用的参数规范。请使用所有产品的规格 相同类型的参数。'

我相信这个问题与这种情况无关:

NSU替代分析仪:


有什么事要做吗?

评论和问题更新后更新:

如果在更改原始答案后仍然存在问题,则可能是夹具中的另一个测试导致了问题。我建议添加到项目中,使用Roslyn可以在编译时发现NSubstitute用法的潜在问题。(我建议将其添加到使用NSubstitute的所有项目中;它确实可以帮助避免许多潜在问题!)

如果NSubstitute.Analyzers没有找到错误,那么不幸的是,我们只剩下一些手动步骤,如中所述


原始答案:

参数匹配器需要与指定调用或断言已接收调用结合使用

您发布的测试有两个地方可能导致此问题:

  • 正如@Fabio在评论中提到的,参数匹配器在
    mockService.ServiceMethod()
    中使用,但没有相应的
    。返回
  • 参数匹配器用于对另一个service.Backup()的真正调用
尝试如下修改测试:

  [Fact]
  public void Test_Method()
  {
     // Arrange       
     this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(...);
     //                               ^- Arg matcher   ^- so need Returns()

     //Act
     var actResult = this.anotherService.Backup(Guid.NewGuid());
     //         Do not use arg matchers for real calls -^

     //Assert
     Assert.True(actResult.Success);
  }
[事实]
公共空隙率试验方法()
{
//安排
this.mockService.ServiceMethod(Arg.Any())。返回(…);
//^-Arg matcher^-so need Returns()
//表演
var actResult=this.anotherService.Backup(Guid.NewGuid());
//不要对实际调用使用arg匹配器-^
//断言
Assert.True(actResult.Success);
}
在您的设备中可能还有另一个导致此问题的原因,但这两种参数匹配器的使用肯定不会有帮助


这些问题在您提到的中描述;如果文件在这些方面不清楚,请提供任何改进本节的建议。从其他角度获取文档信息非常有用,因此您在这方面所做的任何贡献都将不胜感激

评论和问题更新后更新:

如果在更改原始答案后仍然存在问题,则可能是夹具中的另一个测试导致了问题。我建议添加到项目中,使用Roslyn可以在编译时发现NSubstitute用法的潜在问题。(我建议将其添加到使用NSubstitute的所有项目中;它确实可以帮助避免许多潜在问题!)

如果NSubstitute.Analyzers没有找到错误,那么不幸的是,我们只剩下一些手动步骤,如中所述


原始答案:

参数匹配器需要与指定调用或断言已接收调用结合使用

您发布的测试有两个地方可能导致此问题:

  • 正如@Fabio在评论中提到的,参数匹配器在
    mockService.ServiceMethod()
    中使用,但没有相应的
    。返回
  • 参数匹配器用于对另一个service.Backup()的真正调用
尝试如下修改测试:

  [Fact]
  public void Test_Method()
  {
     // Arrange       
     this.mockService.ServiceMethod(Arg.Any<Guid>()).Returns(...);
     //                               ^- Arg matcher   ^- so need Returns()

     //Act
     var actResult = this.anotherService.Backup(Guid.NewGuid());
     //         Do not use arg matchers for real calls -^

     //Assert
     Assert.True(actResult.Success);
  }
[事实]
公共空隙率试验方法()
{
//安排
this.mockService.ServiceMethod(Arg.Any())。返回(…);
//^-Arg matcher^-so need Returns()
//表演
var actResult=this.anotherService.Backup(Guid.NewGuid());
//不要对实际调用使用arg匹配器-^
//断言
Assert.True(actResult.Success);
}
在您的设备中可能还有另一个导致此问题的原因,但这两种参数匹配器的使用肯定不会有帮助


这些问题在您提到的中描述;如果文件在这些方面不清楚,请提供任何改进本节的建议。从其他角度获取文档信息非常有用,因此您在这方面所做的任何贡献都将不胜感激

您应该为模拟服务定义返回值
this.mockService.ServiceMethod(Arg.Any()).Returns(Result.With(Enumerable.Empty())
谢谢Fabio!但我试过了。。。但我还是犯了同样的错误。我更新了问题。您应该为模拟服务定义返回值
this.mockService.ServiceMethod(Arg.Any())。返回值(Result.With(Enumerable.Empty())
谢谢Fabio!但我试过了。。。但我还是犯了同样的错误。我更新了问题。嗨@Igor,我更新了我的答案。让我知道你是怎么做的!:)@我很抱歉给您带来麻烦。堆栈跟踪指向哪一行?我们最好把这个移到这里,这样我们可以分享更多的信息(我不确定这是否能像so问答那样有效)。为了提供帮助,我想我需要更多关于夹具中其他测试的信息(在运行单个夹具时发生,对吗?)。如果您可以通过夹具中的两个或三个测试以及所涉及的类/接口的后精简版本来重现它,那么我认为我们有很好的机会发现问题。@谢谢您的帮助!让我们继续github吧!:)@我很高兴你把它整理好了!根据测试顺序,可以清除一些arg匹配器。下一个NSubstitute版本(4.0)旨在通过更早地检测这些问题来改进这一点。有关wh的技术说明