2016-07-15 8 views
2

を生成します。 mkstempを使用することはできないようですが、特定の接尾辞を付けるにはファイル名が必要ですが、残りのファイル名は必要ありません。 GTestに、テストの最後にファイルの作成と削除を処理する一時ファイルを作成する方法がありますか?私はテストのための一時ファイルを生成する必要がテンポラリファイル/フォルダC++ GTEST

他のアプローチは、それを行うために自分自身のクラスを作成することです。ファイルやフォルダを作成

+0

GoogleテストAFAIKには何も組み込まれていません。 –

答えて

1

は、Googleのテストを含め、任意のテストフレームワークの範囲内にありません。その目的のために、他のライブラリをテストバイナリにリンクしてください。

2

それは一時ファイルを作成しませんが、googletestは、後者は固定式される二つの異なるテスト・マクロ、TESTとTEST_Fを提供します。フィクスチャの詳細については、the Primerの「テストフィクスチャ:同じデータコンフィグレーションを使用する」セクションを参照してください。この問題への

私のソリューションは、固定式のテストで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 
}; 

注:()コンストラクタまたはセットアップ()とデストラクタまたはティアダウンでクローズしてファイルオブジェクトを作成することができますが、私は固定されているすべてのテストで作成されたファイル名を使用しないので、テストでそれを行うことを好みます。したがって、ストリームの例を使用するときは特に注意してください。ここで

は、ファイル名の私の使用である:

// 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から:

unique_path機能を作成するためのパス名は、適切な生成します ディレクトリを含む一時ファイル。名前は ランダム進数で置き換えを指定するには、パーセント記号文字を使用するモデル に基づいています。

注:私ははるかに長いクラス定義から/貼り付け抜粋をコピーして、テストのセット

  • を開始しました一時ファイルのconcise answerためRobbie Morrison

    1. おかげで、とても私を聞かせてください不明な点があるかどうか、または印刷(コピー/ペースト)エラーがあるかどうかを確認してください。
  • 0

    mkstempsは標準ではありませんが、一部のシステムで使用できます。 mkstempためman pageから:

    mkstemps()関数は、テンプレート内の文字列がsuffixlen文字の接尾辞が含まれていることを除いて、)はmkstemp(のようなものです。したがって、templateはprefixXXXXXXsuffixの形式であり、文字列XXXXXXはmkstemp()と同様に変更されます。

    したがって、あなたは多少このようmkstempsを使用することができます。

    // The template in use. Replace '.suffix' with your needed suffix. 
    char temp[] = "XXXXXX.suffix"; 
    // strlen is used for ease of illistration. 
    int fd = mkstemps(temp, strlen(".suffix")); 
    
    // Since the template is modified, you now have the name of the file. 
    puts(temp); 
    

    あなたがプログラムの終了時にそれを削除できるように、ファイル名を追跡する必要があります。これらのファイルをすべて/ tmpに入れるには、 "/ tmp /"を接頭辞として追加できるはずです。しかし、そこに一時的なディレクトリを作成する方法はないようです。

    関連する問題