我正在研究一个给出一些设置的函数 - 比如行间距,输出(以字符串形式)被修改。为了测试这样的场景,我正在使用字符串文字,如下所示的预期结果。
该方法使用字符串构建器(AppendLine
)生成所述输出。我遇到的一个问题是比较这些字符串。在下面的示例中,两者在它们所代表的内容方面是相同的。结果是我关心的区域,但是当比较两个字符串时,一个字面值,一个字母,不平等自然会失败。这是因为其中一个字符串发出行间距,而另一个字符串只显示它包含的格式。
解决这个平等问题的最佳方法是什么?我非常关心格式化,例如方法结果中的新行,这一点至关重要。
代码:
string expected = @"Test\n\n\nEnd Test.";
string result = "Test\n\n\nEnd Test";
Console.WriteLine(expected);
Console.WriteLine(result);
输出:
Test\n\n\nEnd Test. Test End Test
答案 0 :(得分:4)
@
前缀告诉编译器完全按照写入的方式获取字符串。因此,它不会将\n
字符格式化为回车符和换行符。
由于分配给 result 变量的字符串没有相同的前缀,因此编译器会对其进行格式化。如果您想继续使用@
前缀,请执行以下操作:
string expected = @"Test
End Test";
您必须在字符串中输入回车符和换行符作为不可见字符。
答案 1 :(得分:3)
您错误地使用了“文字”一词。 “Literal”仅表示代码中存在的实际值。换句话说,代码中的值存在为变量(为了简单起见,我在此组中包含常量)和文字。变量是值的抽象概念,而文字是值。
这就是说你的两个字符串都是字符串文字,因为它们是硬编码到你的应用程序中的。 @
前缀只是声明编译器要在字符串中包含转义字符(实际上是双引号以外的任何字符),而不是在将字符串文字编译到程序集时评估转义序列。
首先,无论函数返回什么(包含换行符的标准转义序列而不是换行符本身的字符串,或实际包含换行符的字符串)都是您的测试变量应包含的。使您的测试尽可能接近实际输出,因为您将更多的工作量按到可比较的形式,您需要测试的代码路径越多。如果您希望能够将字符串与嵌入其中的格式转义序列进行比较,并将字符串评估为这些序列(实际上是比较示例中的两个字符串),那么我会这样说:
对于做#2,RegEx处理器可能是最简单的选择。有关C#字符串转义序列的列表,请参阅this page。
答案 2 :(得分:0)
我觉得有些开悟,但对我发现的东西感到恼火。
这是我使用MSTest的第一个项目,在测试失败后,我选择了查看测试详细信息来查看测试失败的原因和原因。此详细信息显示中字符串输出的格式很差,例如:
Assert.AreEqual failed. Expected:<TestTest End>. Actual:<TestTest End>.
这是针对格式化文本的 - 奇怪的是如果你有/r
(换行符)而不是换行符(/n
),格式化实际上是正确的。
结果是在 debug 模式下查看运行测试所需的正确输出。换句话说,如果测试失败,请在调试中运行测试,异常将被捕获并显示如下:
Assert.AreEqual failed. Expected:<Test
Test End>. Actual:<Test
Test End>.
以上显然包含正确的格式。
最后我发现我在字符串中存储期望(格式化)的初始方法是正确的,但我对MSTest的不熟悉使我质疑我的意思,因为它似乎是有效的输入,但只是显示回到我自己看似有效的输出。
答案 3 :(得分:-1)
在进行比较之前使用正则表达式去除空格?