テスト作る時にファイルを用意するのがメンドイので作ったテキトーなクラスのメモ

テスト作る時にファイルを用意するのがメンドイので作ったテキトーなクラスのメモ

    public class ResourceHelper
    {
        /// <summary>テスト用一時フォルダ</summary>
        public string TestTemp { get { return testTemp; } }

         /// <summary>testTemp直下のファイルパスを返す</summary>
         /// <param name="fileName">ファイル名</param>
         /// <returns>ファイルパス</returns>
        public string GetTestFilePath(string fileName)
        {
            return Path.Combine(testTemp, fileName);
        }

        /// <summary>testTempにファイルを作成する</summary>
        /// <param name="fileName">作成するファイル名</param>
        /// <param name="data">保存するデータ</param>
        /// <param name="overwrite">
        /// true : 既にファイルが存在する場合は上書きする
        /// false : 既にファイルが存在する場合はInvalidOperationExceptionを投げる
        /// </param>
        /// <return>作成したファイルのパスを返す</return>
        public void CreateTempFile(string fileName, byte[] data, bool overwrite)
        {
            string filePath = GetTestFilePath(fileName);
            if (overwrite == false && File.Exists(filePath))
            {
                throw new InvalidOperationException("既にファイルが存在する");
            }

            using (var stream = File.Create(filePath))
            {
                if (data != null && data.Length != 0)
                {
                    stream.Write(data, 0, data.Length);
                }
            }
            return filePath;
        }

        /// <summary>testTempにファイルを作成する</summary>
        /// <param name="fileName">作成するファイル名</param>
        /// <param name="text">保存するテキスト。
        /// 文字エンコーディングはコンストラクタで指定したencoding</param>
        /// <param name="overwrite">
        /// true : 既にファイルが存在する場合は上書きする
        /// false : 既にファイルが存在する場合はInvalidOperationExceptionを投げる
        /// </param>
        public string CreateTempFile(string fileName, string text, bool overwrite)
        {
            return CreateTempFile(fileName, encoding.GetBytes(text), overwrite);
        }

        /// <summary>testTempディレクトリを準備する</summary>
        /// <remarks>
        /// testTempディレクトリが存在しなければ作成する。
        /// 既に存在し、ディレクトリ内にファイルがある場合は cleanup
        /// で中身を消すか消さないかを決める。
        /// </remarks>
        /// <param name="cleanup">testTempディレクトリの中身を全削除のフラグ</param>
        public void SetupTestTemp(bool cleanup)
        {
            if (Directory.Exists(testTemp))
            {
                if (cleanup &&
                    Directory.GetFiles(testTemp).Length != 0)
                {
                    Directory.Delete(testTemp, true);
                    Directory.CreateDirectory(testTemp);
                }
            }
            else
            {
                Directory.CreateDirectory(testTemp);
            }
        }

        /// <summary>testTempディレクトリを中身ごと削除する</summary>
        public void DeleteTestTemp()
        {
            Directory.Delete(testTemp, true);
        }

        /// <summary>testTemp内のテキストファイルを取得</summary>
        public string ReadTestTextFile(string fileName)
        {
            return File.ReadAllText(GetTestFilePath(fileName), encoding);
        }

        /// <summary>testTemp内のファイルデータを取得</summary>
        public byte[] ReadTestFile(string fileName)
        {
            return File.ReadAllBytes(GetTestFilePath(fileName));
        }

        /// <summary>testTemp内のXMLファイルを取得</summary>
        public XmlDocument LoadTestXml(string fileName)
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(GetTestFilePath(fileName));
            return xml;
        }

        /// <summary>コンストラクタ</summary>
        /// <param name="encoding">使用するエンコーディング</param>
        public ResourceHelper(Encoding encoding)
        {
            string temp = Path.GetTempPath();
            while (string.IsNullOrWhiteSpace(testTemp))
            {
                string dir = Path.Combine(temp, "_MyTest_" + System.Guid.NewGuid().ToString());
                if (!File.Exists(dir) && !Directory.Exists(dir))
                {
                    testTemp = dir;
                }
            }

            this.encoding = encoding ?? Encoding.UTF8;
        }

        /// <summary>
        ///  テスト用の一時フォルダ。
        ///  使用されていない(存在しない)ディレクトリをコンストラクタで生成して保持する
        /// </summary>
        private string testTemp = null;

        private Encoding encoding = null;
    }
Share
関連記事