如何在 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;
我在 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;