gpt4 book ai didi

c++ - 生成临时文件/文件夹 c++ GTEST

转载 作者:太空狗 更新时间:2023-10-29 21:37:06 27 4
gpt4 key购买 nike

我需要为测试生成临时文件。看起来我不能使用 mkstemp 因为我需要文件名有一个特定的后缀,但我不关心文件名的其余部分。 GTest 中有没有一种方法可以创建一个临时文件来处理文件的创建以及测试结束时的删除。

另一种方法是创建我自己的类来执行此操作。

最佳答案

虽然它不构建临时文件,googletest 提供了两个不同的测试宏,TEST 和 TEST_F,后者是固定的。请参阅 the Primer 上标题为“测试夹具:使用相同的数据配置...”的部分有关灯具的更多信息。

我对这个问题的解决方案是使用带有固定测试的 Boost.Filesystem。我希望能够拥有一个为所有测试共享的命名临时子目录。在这种情况下,我正在调整我的案例以适应 OP 对指定后缀的请求。

包括:

// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>

测试类定义:

class ArchiveTest : public ::testing::Test {
protected:
boost::filesystem::path mTempFileRel;
boost::filesystem::path mTempFileAbs;
std::ofstream mExampleStream;

ArchiveTest() {
mTempFileRel = boost::filesystem::unique_path("%%%%_%%%%_%%%%_%%%%.your_suffix");
mTempFileAbs = boost::filesystem::temp_directory_path() / mTempFileRel;
mExampleStream.open(mTempFileAbs);
}

~ArchiveTest() {
if(mExampleStream.is_open())
{
mExampleStream.close();
}
}
// Note there are SetUp() and TearDown() that are probably better for
// actually opening/closing in case something throws
};

注意:虽然您可以在构造函数或 SetUp() 中创建文件对象并在析构函数或 TearDown() 中关闭,但我更喜欢在测试中这样做,因为我不使用在所有测试中创建的文件名固定的。因此,在使用流示例时要格外小心。

这是我使用的文件名:

// Tests that an ArchiveFile can be written
TEST_F(ArchiveTest, TestWritingArchive) {
try
{
TheInfo info_; // some metadata for the archive
MyArchive archive_; // Custom class for an archive
archive_.attachToFile(mTempFile, info_);

...
}
catch(const std::exception& e_)
{
FAIL() << "Caught an exception in " << typeid(*this).name()
<< ": " << e_.what();
}
}

如果你对'%'字符感到好奇,来自the reference on unique_path :

The unique_path function generates a path name suitable for creating temporary files, including directories. The name is based on a model that uses the percent sign character to specify replacement by a random hexadecimal digit.

注意事项:

  1. 感谢Robbie Morrison对于 concise answer关于让我开始的临时文件
  2. 我从一个更长的类定义和一组测试中复制/粘贴了摘录,所以如果有任何不清楚的地方或是否存在打印(复制/粘贴)错误,请告诉我。

关于c++ - 生成临时文件/文件夹 c++ GTEST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38398288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com