我正在尝试使用Arg.Any<T>()
参数模拟该方法。嘲笑的方法在.netframework而不是netcoreapp中正确重定向。
这是与此问题类似的link,但此问题似乎是NSubstitute在网络核心中无法正常工作。
Github链接为here
注意:代替传递Arg.Any值,传递特定的参数值可以正常工作
在netframework(4.5.1)库和net core app(2.1)库中进行了比较。
Dotnet Core结果:
Test Name: ClassLibrary1.Class1.Method
Test FullName: ClassLibrary1.Class1.Method
Test Source: C:\Users\mmohan\source\repos\ClassLibrary1\ClassLibrary1\Class1.cs : line 10
Test Outcome: Failed
Test Duration: 0:00:00.177
Result StackTrace: at ClassLibrary1.Class1.Method() in C:\Users\mmohan\source\repos\ClassLibrary1\ClassLibrary1\Class1.cs:line 16
Result Message:
Assert.Throws() Failure
Expected: typeof(System.FormatException)
Actual: (No exception was thrown)
净框架结果:
Test Name: ClassLibrary1.Class1.Method
Test FullName: ClassLibrary1.Class1.Method
Test Source: C:\Users\mmohan\source\repos\SampleTestIssue\ClassLibrary1\Class1.cs : line 10
Test Outcome: Passed
Test Duration: 0:00:00.292
我的代码:
using NSubstitute;
using System;
using Xunit;
namespace ClassLibrary1
{
public class Class1
{
[Fact]
public void Method()
{
IB b = Substitute.For<IB>();
A a = new A(b);
b.doSomeB(Arg.Any<string>()).Returns(x => { throw new FormatException("Something there"); });
a.doSomeA("");
Exception exception = Assert.Throws<FormatException>(
() => b.doSomeB(Arg.Any<string>()));
}
}
public class A
{
public IB _b;
public A(IB b)
{_b = b;}
public void doSomeA(string aa)
{
try
{ _b.doSomeB("");}
catch (Exception ex){ }
}
}
public class B : IB
{
public string doSomeB(string bb)
{
try{ }
catch (Exception ex){ }
return "";
}
}
public interface IB
{
string doSomeB(string bb);
}
}
答案 0 :(得分:2)
行为不一致的问题是由参数匹配器的错误使用引起的。在测试的最后一行中
Exception exception = Assert.Throws(
() => b.doSomeB(Arg.Any()));
因此您在NSubstitute“ context”之外使用Arg.Any
-意味着您没有指定Return,Throw或任何其他应执行的NSubstitute操作。请查看文档here和here。长话短说
仅在出于设置返回值,检查已接收呼叫或配置回调(例如:使用
Returns
,Received
或When
的目的而指定调用时才使用参数匹配器) 。在其他情况下使用Arg.Is
或Arg.Any
可能会导致测试行为异常。
用实际值替换Arg.Any
中的Assert.Throws
时,测试将变为绿色。