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);
}
}