如何在 std::string 中硬编码或声明文件内容

How to hard code or declare the content of a file in std::string

我在 CSV 文件中有以下内容

Column1, Column2, Column3, Column4, Column5 
something, false, somemore, 1.010000, 1.020000

以上 CSV 文件内容是根据我的库的方法return编辑为std::string的。

std::string GetCsvContent() {
    // Create csv content
    return csv_content;
}

现在我想进行单元测试GetCsvContent。我知道对于某个输入它会 return 什么。但是为了能够进行测试,我需要在 std::string 中预先声明 CSV 内容。如下所示。

std::string expected_csv_content = "Column1, Column2, Column3, Column4, Column5\nsomething, false, somemore, 1.010000, 1.020000";
EXPECT_EQ(expected_csv_content, my_library_object.GetCsvContent());

但是上面的声明方式expected_csv_content是不正确的,因为它与下面的数据格式不完全匹配。

Column1, Column2, Column3, Column4, Column5 
something, false, somemore, 1.010000, 1.020000

有没有像下面这样用 R 表示法声明的方法?

const std::string expected_csv_content = R"(
    Column1, Column2, Column3, Column4, Column5
    something, false, somemore, 1.010000, 1.020000
)";

问题:
我的问题是,如果我愿意,如何硬编码或声明 CSV 或 std::string 中的任何小文件的内容以进行比较?

您可以使用原始字符串文字,但问题是那些行缩进也是字符串的一部分,您在开头和结尾添加的换行符也是如此。使用原始字符串的另一个问题是换行符本身——如果您最终使用将 OS 特定换行符放入您的代码 (e.g.CRLF) 的文本编辑器,您可能会以失败的测试而告终真的很难找出原因。

我首先怀疑不匹配问题是因为您的 CSV 在 行之后输出一个换行符,但在您的(非原始)测试字符串中您没有在末尾换行。

如果你想在你的代码中有一个更好的布局,那么你可以像下面这样连接普通的字符串文字:

const std::string expected_csv_content =
    "Column1, Column2, Column3, Column4, Column5\n"
    "something, false, somemore, 1.010000, 1.020000\n";

有了上面的内容,就很容易看到数据,如果您想向测试中添加内容,您可以轻松 copy/paste 行,并且换行符的视觉效果很好。如果您想复制多行文本用于其他测试,您可以使用简单的正则表达式 search/replace.

轻松地在字符串形式和原始文本之间进行转换

如果我的项目需要常量数据,这些数据最初存储在一些文件中,独立于生产或测试代码,我只需将输入文件转换为 char 数组并将其用作字符串或其他内容。

示例: 文件:file.txt

hallo
test

xxd -i file.txt > file.h

file.h的内容变为:

unsigned char test_txt[] = {
  0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x0a
};
unsigned int test_txt_len = 11;