概要
C# のモックライブラリ Moq を用いて ref を持つメソッドの参照渡しの値をモック化する方法になります。
参考情報
丁寧に解説されていたため、参考になりました。
https://dontcodetired.com/blog/post/Setting-Up-Mock-ref-Return-Values-in-Moq
解説
Moq の バージョン 4.8 以降にて、refパラメータに対する対応が実施されています。
その際、作成したモックにて参照渡しの値を設定するコードサンプルをメモとして残します。
/// <summary>
/// テスト対象となるインターフェースです
/// </summary>
public interface ITestTarget
{
void DoSomething(string value1, ref string value2);
}
/// <summary>
/// コールバック用のデリデートを定義します
/// </summary>
/// <param name="value1"></param>
/// <param name="value2"></param>
delegate void DoSomethingCallback(string value1, ref string value2);
[TestClass]
public class UnitTest
{
[TestMethod]
public void TestMethod()
{
// Arrange
var mock = new Mock<ITestTarget>();
// モックの振る舞いを登録します
// ref参照の変数で値を変更します
mock.Setup(_ => _.DoSomething(It.IsAny<string>(), ref It.Ref<string>.IsAny))
.Callback(new DoSomethingCallback((string value1, ref string value2) => value2 = "This is output value."));
var target = mock.Object;
// Act
var input = "This is input value.";
target.DoSomething("", ref input);
// Assert
Assert.AreEqual("This is output value.", input);
}
}
まず、テスト対象メソッドが呼ばれた際のコールバック用のデリゲートを定義しておきます。
そして、Callback
にて ref に設定する変数を変更するように記載すれば OK です。