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

劳拉克

我需要生成一个临时文件进行测试。看来我无法使用,mkstemp因为我需要文件名具有特定的后缀,但是其余的文件名我不在乎。GTest中有没有一种方法可以创建一个临时文件来处理文件的创建以及测试结束时的删除。

另一种方法是创建我自己的类来做到这一点。

智者

尽管googletest不会构建临时文件,但它提供了两个不同的测试宏,即TEST和TEST_F,后者已固定在那里。有关夹具的更多信息,请参见“入门”中标题为“测试夹具:使用相同数据配置...”的部分

我对这个问题的解决方案是将Boost.Filesystem与固定测试一起使用。我希望能够有一个命名的temp子目录,所有测试都可以共享该目录。在这种情况下,我将调整我的情况以适合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();
    }
}

如果您对'%'字符感到好奇,请参考unique_path上的参考

unique_path函数会生成适合于创建临时文件(包括目录)的路径名。该名称基于一个模型,该模型使用百分号字符指定由随机十六进制数字表示的替换。

笔记:

  1. 感谢罗比·莫里森Robbie Morrison)对使我入门的临时文件简洁回答
  2. 我从更长的类定义和测试集中复制/粘贴了摘录,因此请让我知道是否有任何不清楚的地方,或者是否存在印刷(复制/粘贴)错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章