我知道为什么会这样。 编译时字符串常量总是有“ ”。 运行时使用 System.Environment.NewLine 这是“ " 在 Mac 上(可能还有 Linux)
是否有一种干净的方法来编写对两者都适用的测试?
[Fact]
public void StringConst()
{
var expected = """
""";
var actual = new StringBuilder()
.AppendLine()
.ToString();
Assert.Equal(expected, actual); // Fails on Mac
}
我真的不想写;
Assert.Equal(expected, actual.ReplaceLineEndings("\r\n"));
Assert.Equal(expected, actual.Replace(Environment.NewLine, "\r\n"));
更新:
感谢@sweeper 为我指明了正确的方向。 字符串常量取决于您的编辑器。如果您的编辑器设置为使用 CRLF,那么这就是字符串常量的内容。如果您的编辑器使用 LF 作为行尾,那么就使用它。 无声无形的问题。
由于多行字符串常量取决于
.cs
文件的保存方式,而 StringBuilder.AppendLine
取决于其运行环境,因此一致的结果意味着始终与换行符的使用保持一致。
我的 .editorconfig 有
[*.cs]
end_of_line = crlf
我最终为每当我向字符串添加换行符时编写扩展方法。
public static StringBuilder AppendWithCRLF(this StringBuilder sb, string value) =>
sb.Append(value)
.Append("\r\n");
public static StringBuilder AppendCRLF(this StringBuilder sb) =>
sb.Append("\r\n");
Environment.NewLine
:
[Fact]
public void StringConst()
{
var expected = Environment.NewLine;
var actual = new StringBuilder()
.AppendLine()
.ToString();
Assert.Equal(expected, actual);
}