带有任何参数的Nsubstitute模拟方法无法正常工作.NET Core

时间:2019-07-12 12:44:17

标签: c# .net-core nsubstitute

我正在尝试使用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);
    }
}

1 个答案:

答案 0 :(得分:2)

行为不一致的问题是由参数匹配器的错误使用引起的。在测试的最后一行中

Exception exception = Assert.Throws(
() => b.doSomeB(Arg.Any()));

因此您在NSubstitute“ context”之外使用Arg.Any-意味着您没有指定Return,Throw或任何其他应执行的NSubstitute操作。请查看文档herehere。长话短说

  

仅在出于设置返回值,检查已接收呼叫或配置回调(例如:使用ReturnsReceivedWhen的目的而指定调用时才使用参数匹配器) 。在其他情况下使用Arg.IsArg.Any可能会导致测试行为异常。

用实际值替换Arg.Any中的Assert.Throws时,测试将变为绿色。