我使用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.");
}
对我来说,新系列存在问题。有没有人有解决方案,因为适应所有单元测试是一团糟。
答案 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 在资源管理器中正确添加新行。
您可以使用以下几种方法:
Environment.NewLine属性,它知道当前环境的新行符号:
callable.Received(1).ShowText("Some text with a new" + Environment.NewLine + "line.");
在预期的字符串中使用显式换行符:
callable.Received(1).ShowText(@"Some text with a new
line.");