NSubstitute:当字符串来自资源时,Received()不检查字符串参数

时间:2016-08-11 07:38:25

标签: c# string unit-testing nunit nsubstitute

我使用NSubstitute进行NUnit测试,并尝试检查是否使用正确的值调用方法。直到知道一切正常。我必须本地化文本,因此使用资源字符串。现在每个单元测试都失败了,它测试了一个接收的方法,其中一个字符串参数包含一个新行。

这是一个简化的例子:

// Old Version, where the unit test succeed
public void CallWithText(ICallable callable)
{
    callable.ShowText("Some text with a new\nline."); 
}

// New Version, where the unit test fails
// Text of `Properties.Resources.TextWithNewLine` in the
// Resources.resx is "Some text with a new
// line."
public void CallWithText(ICallable callable)
{
    callable.ShowText(Properties.Resources.TextWithNewLine); 
}

[Test]
public void CallWithText_WhenCalled_CallsCallable()
{
    var caller = new Caller();
    var callable = Substitute.For<ICallable>();

    caller.CallWithText(callable);

    callable.Received(1).ShowText("Some text with a new\nline.");
}

对我来说,新系列存在问题。有没有人有解决方案,因为适应所有单元测试是一团糟。

3 个答案:

答案 0 :(得分:1)

比较单元测试中的确切字符串将增加更多的维护工作 在您的情况下,new line在不同的执行环境中可能会有所不同。

对于字符串,我建议使用Contains方法声明传递的参数。在哪里可以检查更重要的单词

[Test]
public void CallWithText_WhenCalled_CallsCallable()
{
    var caller = new Caller();
    var callable = Substitute.For<ICallable>();

    caller.CallWithText(callable);

    callable.Received(1).ShowText(Arg.Is<string>(text => text.Contains("Some text")));
}

答案 1 :(得分:1)

这表示Properties.Resources.TextWithNewLine"Some text with a new\nline."不同。在不了解Properties.Resources.TextWithNewLine的情况下,我建议您尝试将测试更改为

[Test]
public void CallWithText_WhenCalled_CallsCallable()
{
    var caller = new Caller();
    var callable = Substitute.For<ICallable>();

    caller.CallWithText(callable);

    callable.Received(1).ShowText(Arg.Any<string>());
}

如果你真的要断言字符串的内容,请使用实际的字符串,更改为(确保资源文件在测试项目中)

[Test]
public void CallWithText_WhenCalled_CallsCallable()
{
    var caller = new Caller();
    var callable = Substitute.For<ICallable>();

    caller.CallWithText(callable);

    callable.Received(1).ShowText(Properties.Resources.TextWithNewLine);
}

答案 2 :(得分:1)

问题与NSubstitute无关,而与String本身有关。新行符号不仅仅是\n。它是特定于环境的:Windows上为\r\n,Unix上为\n,早期Mac操作系统上为\r。请使用 Shift + Enter 在资源管理器中正确添加新行。

您可以使用以下几种方法:

  1. Environment.NewLine属性,它知道当前环境的新行符号:

    callable.Received(1).ShowText("Some text with a new" + Environment.NewLine + "line.");
    
  2. 在预期的字符串中使用显式换行符:

    callable.Received(1).ShowText(@"Some text with a new
    line.");