0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# の XUnit で private static method をテストする

Posted at

private method をテストするには Reflection で!というのは良く出てくる。
では private static method は?ということで書いてみる。
ついでに Exception もテストする。

テスト対象コード

こんな感じのファイルパスを受け取ってディレクトリ名を返すシンプルな private static method があるとする。

using System;
using System.IO;

public class FileUtil
{
    /// <summary>
    /// ファイルパスからディレクトリ名を取得
    /// </summary>
    /// <param name="filePath">ファイルパス</param>
    /// <returns>ディレクトリ名</returns>
    private static string GetDirectoryName(string filePath)
    {
        if (string.IsNullOrEmpty(filePath))
        {
            throw new ArgumentException("File path が null または 空です。", nameof(filePath));
        }
    
        return Path.GetDirectoryName(filePath);
    }
}

テストコード

こんな感じでメソッドを実行できる。Invoke した method は Exception を投げられた時に「TargetInvocationException」が返されるため、ex.InnerException を再度 throw する。

using System;
using System.Reflection;
using Xunit;

public class FileUtil_GetDirectoryNameTest
{
        /// <summary>
        ///  private static method の GetDirectoryName テスト用 Reflection
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private string Reflection_GetDirectoryName(string filePath)
        {
            var method = typeof(FileUtil).GetMethod("GetDirectoryName", BindingFlags.NonPublic | BindingFlags.Static);
            try
            {
                return (string)method.Invoke("GetDirectoryName", new object[] { filePath });
            }
            catch (Exception ex)
            {
                throw ex.InnerException;
            }
        }

        [Fact]
        public void ValidInput_ReturnsGetDirectoryName()
        {
            // Arrange
            string filePath = @"C:\example\test.xml";
            string expected = @"C:\example";

            // Act
            string result = Reflection_GetDirectoryName(filePath);

            // Assert
            Assert.Equal(expected, result);
        }

        [Theory]
        [InlineData(null)]
        [InlineData("")]
        public void InvalidFilePath_ThrowsArgumentException(string filePath)
        {
            // Act and Assert
            var exception = Assert.Throws<ArgumentException>(() => Reflection_GetDirectoryName(filePath, newExtension));
            Assert.Equal("File path が null または 空です。 (Parameter 'filePath')", exception.Message);
        }
}
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?