署名検証みたいな実物がないとテストがし辛い処理で、実物が来るまで一時的にモックを使ってテストをしたい部分があった。
諸々の事情で別クラスに分けるわけにもいかず、どうにかならないものかと思って書いたもの。
この発想を忘れないように書き記しておく。
環境
.NET6
xUnit
NSubstitute(モックライブラリ)
テストしたいコード
public class Receipt
{
public string Invoke(string token)
{
// 検証
if (!Verify(token))
{
// 検証失敗
throw;
}
return "";
}
private bool Verify(string token)
{
// 検証処理省略
return true;
}
}
大雑把に書くとこんな感じの処理。
Verifyメソッドは実物がないと動かないのでそれまではモック化しておきたい。
スタブを作る
まずモック化したいメソッドをインターフェースで抽象化しておく。
public interface IVerify
{
bool Verify(string token);
}
スタブからメソッドを参照する
コンストラクタで渡された実装済みのインスタンスからメソッドを参照するようにコードを追記。
このときモック化したいメソッドがpublicになってしまうので本当にその場しのぎ感がある。
public class Receipt
{
private readonly IVerify _verify;
public Receipt(IVerify verify)
{
_verify = verify;
}
public string Invoke(string token)
{
// 検証
if (!_verify.Verify(token))
{
// 検証失敗
throw;
}
return "";
}
public bool Verify(string token)
{
// 処理省略
return true;
}
}
UnitTest側
[Fact]
public void Test200()
{
// Verifyをモック化
var verify = Substitute.For<IVerify>();
verify.Verify(Arg.Any<string>()).Returns(true);
// モックを渡す
var receipt = new Receipt(verify);
// テスト対象
var result = receipt.Invoke("token");
Assert.Equal(result, "");
}
これでその場しのぎだがテストができるようになった。
以上