如何在Nsubsitute中使用内部服务?

时间:2019-01-09 11:03:12

标签: c# .net-core nsubstitute

我有一个包含内部帮助器的类,例如以下代码:

[assembly: InternalsVisibleTo("Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
namespace NS.B
{
    public class A {
        internal readonly B _bHealper;
        public int GetBag(string s1, string s2){
            return _bHelper.GetBag(s1, s2);
        }
    }
}

[assembly: InternalsVisibleTo("Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

namespace NS.B
{
    internal class B 
    {        
         public int GetBag(string str1, string str2){
             /// do some work 
             return result;
         }
    }
}

然后我尝试在A类中模拟我的助手,并通过以下代码测试A类GetBag函数:

 [Fact]
    public void checkBaggageRule()
    {
        var repo = Substitute.For<A>();
        repo._bHelper.GetBag(Arg.Any<string>(), Arg.Any<string>()).Returns(30);
        var result = repo.GetBag("oo", "L");
        Assert.True(result != null);
        Assert.True(result == 30);
    } 

但是在调试测试时出现此异常:

  

NSubstitute.Exceptions.UnexpectedArgumentMatcherException:参数   匹配器(Arg.Is,Arg.Any)只能代替成员   论点。不要在Return()语句或其他任何地方使用   在会员电话之外。

我如何嘲笑这个内部成员并通过测试?

1 个答案:

答案 0 :(得分:1)

示例中没有足够的代码可以肯定地说明问题,但是我不确定internal关键字是否引起了问题。如果将它们全部设为public,会得到相同的错误吗?

还有一些其他可能会给您带来麻烦的问题。

首先,尝试安装NSubstitute.Analyzers软件包,该软件包将检测到诸如尝试替换非虚拟成员之类的问题。

接下来,示例代码不显示A._bHelper的初始化方式。让我们对其进行更新以使用构造函数注入,然后替换依赖项而不是整个受测类(如@Nkosi在评论中指出的那样)。

public class A
{
    public A(MssqlEntityHelper helper) { _bHelper = helper;  }
    internal readonly MssqlEntityHelper _bHelper;
    public int GetBag(string s1, string s2) {
        return _bHelper.GetBag(s1, s2);
    }
}

// Tests:
[Fact]
public void SampleTest() {
    var repo = new NS.B.A(Substitute.For<NS.B.MssqlEntityHelper>());
    repo._bHelper.GetBag(Arg.Any<string>(), Arg.Any<string>()).Returns(30);
    var result = repo.GetBag("oo", "L");
    Assert.True(result == 30);
}

正如NSubstitute.Analyzers软件包所指出的那样,需要将MssqlEntityHelper.GetBag()制作为virtual,NSubstitute才能使用它:

public class MssqlEntityHelper {
    public virtual int GetBag(string str1, string str2) { ... }
}

这些更改将根据提供的示例代码获得通过测试。您看到的确切异常可能是该测试的结果或其他测试中的问题,可能是试图替换早期测试中的非虚拟成员。希望安装NSubstitute.Analyzers软件包可以帮助您找到这些情况。如果仍然不能解决问题,我们可以尝试其他一些调试步骤(单独运行测试,运行单个夹具,查看测试日志以查看测试执行顺序以及查看先前的测试是否导致出血问题)进行此测试等)。