c# 多行字符串常量、StringBuilder 和单元测试

问题描述 投票:0回答:2

我知道为什么会这样。 编译时字符串常量总是有“ ”。 运行时使用 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 作为行尾,那么就使用它。 无声无形的问题。

c# string constants multiline
2个回答
0
投票

由于多行字符串常量取决于

.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");

-1
投票

使用

Environment.NewLine

[Fact]
public void StringConst()
{
    var expected = Environment.NewLine;
    var actual = new StringBuilder()
        .AppendLine()
        .ToString();

  Assert.Equal(expected, actual);
}
© www.soinside.com 2019 - 2024. All rights reserved.