🐷

C# Moqを使ったテストコードでのメソッド呼び出し回数ごとに戻り値の設定

2024/08/08に公開

Moqを使ったテストコードでのメソッド呼び出しごとの戻り値の設定

はじめに

単体テストは、ソフトウェア開発において品質を保証するための重要なプロセスです。C#のテストフレームワークであるMoqを使用すると、依存関係をモックしてテストを容易に行うことができます。本記事では、Moqを使ってメソッドの呼び出しごとに異なる戻り値を返す方法をMSTestを使用して紹介します。

Moqとは

Moqは、.NET向けのモッキングフレームワークであり、依存関係を簡単にモックすることができます。これにより、外部依存関係に影響されずにユニットテストを行うことが可能になります。

セットアップ

まず、MoqとMSTestを使用するための環境をセットアップします。以下の手順で進めていきます。

1. MoqとMSTestのインストール

NuGetパッケージマネージャーを使用して、MoqとMSTestをインストールします。

dotnet add package Moq
dotnet add package MSTest.TestFramework
dotnet add package MSTest.TestAdapter

2. テストプロジェクトの作成

テストプロジェクトを作成し、必要な依存関係を追加します。

dotnet new mstest -n MyServiceTests
cd MyServiceTests

テストシナリオの設定

今回は、IMyServiceというインターフェースを持つサービスのテストを行います。このインターフェースには、MyMethodというメソッドが含まれています。MyMethodは、最初の呼び出しではtrueを返し、2回目の呼び出し以降ではfalseを返すように設定します。

1. インターフェースの定義

まず、テスト対象となるインターフェースを定義します。

public interface IMyService
{
    bool MyMethod();
}

2. テストの実装

次に、MSTestとMoqを使用してテストを実装します。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace MyServiceTests
{
    [TestClass]
    public class MyServiceTests
    {
        public interface IMyService
        {
            bool MyMethod();
        }

        [TestMethod]
        public void TestMyMethod()
        {
            // Arrange
            var mockService = new Mock<IMyService>();
            mockService.SetupSequence(service => service.MyMethod())
                       .Returns(true)   // 最初の呼び出し
                       .Returns(false); // 2回目以降の呼び出し

            // Act
            var result1 = mockService.Object.MyMethod(); // ここではtrueが返る
            var result2 = mockService.Object.MyMethod(); // ここではfalseが返る

            // Assert
            Assert.IsTrue(result1);
            Assert.IsFalse(result2);
        }
    }
}

テストの実行

dotnet testコマンドを使用して、テストを実行します。

dotnet test

すべてのテストがパスすることを確認します。これにより、メソッドが最初の呼び出し時にはtrueを返し、2回目以降はfalseを返すことが検証されます。

まとめ

Moqを使用することで、簡単に依存関係をモックし、メソッドの呼び出しごとに異なる戻り値を設定することができます。本記事では、SetupSequenceメソッドを使用して、具体的な例を示しました。この技法を活用することで、複雑なロジックのテストも容易に行うことができるようになります。

Discussion