我有一种测试方法:
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
有什么事要做吗?
答案 0 :(得分:2)
评论和问题更新后更新:
如果从我的原始答案进行更改后仍然存在问题,则可能是夹具中的另一项测试引起了问题。我建议向项目添加NSubstitute.Analyzers,这样可以在使用Roslyn进行编译时解决NSubstitute用法的潜在问题。 (我建议将此内容添加到所有使用NSubstitute的项目中;它确实可以帮助避免很多潜在的问题!)
如果NSubstitute.Analyzers找不到错误,那么很遗憾,我们只剩下this answer中所述的一些手动步骤。
原始答案:
参数匹配器需要与指定呼叫或断言已收到呼叫一起使用。
您发布的测试有两个可能导致此问题的地方:
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提出改进本节的任何建议。从其他角度获得有关文档的输入非常有用,因此,您在此方面所做的任何贡献将不胜感激!