NSubstitute无法确定在“运行项目的所有测试”

时间:2018-11-02 20:50:52

标签: 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); //returns Result<IEnumerable<string>>


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

     //Assert
     Assert.True(actResult.Success);
  }
  ...

要测试此方法:

public class AnotherService
{

  internal Result Backup()
  {
    var ret = this.mockService.ServiceMethod().Value;

    ...

    return Result.Ok();
  }

当我仅对Test_Method()运行该方法时,一切都会很好。当我尝试为整个MyTests类运行时,在此Refer方法上出现以下错误:

  

NSubstitute.Exceptions.AmbiguousArgumentsException:'无法确定   要使用的参数规范。请全部使用规格   相同类型的参数。'

我相信这个问题与这种情况无关: How NOT to use argument matchers

NSubstitute.Analyzers

NSubstitute.Analyzers

有什么事要做吗?

1 个答案:

答案 0 :(得分:2)

评论和问题更新后更新:

如果从我的原始答案进行更改后仍然存在问题,则可能是夹具中的另一项测试引起了问题。我建议向项目添加NSubstitute.Analyzers,这样可以在使用Roslyn进行编译时解决NSubstitute用法的潜在问题。 (我建议将此内容添加到所有使用NSubstitute的项目中;它确实可以帮助避免很多潜在的问题!)

如果NSubstitute.Analyzers找不到错误,那么很遗憾,我们只剩下this answer中所述的一些手动步骤。


原始答案:

参数匹配器需要与指定呼叫或断言已收到呼叫一起使用。

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

  • 正如@Fabio在评论中提到的那样,在mockService.ServiceMethod()中使用了参数匹配器,而没有相应的.Returns
  • 参数匹配器用于实际调用anotherService.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);
  }

您的装置中可能还有另一个原因导致此问题,但是参数匹配器的这两种用法绝对不会有帮助!

您提到的argument matcher documentation中描述了这些问题;如果文档在这些方面不清楚,请raise an issue提出改进本节的任何建议。从其他角度获得有关文档的输入非常有用,因此,您在此方面所做的任何贡献将不胜感激!