LoginSignup
4
4

More than 3 years have passed since last update.

Moq で ref を持つメソッドの参照渡しの値をモック化する

Posted at

概要

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 です。

4
4
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
4
4