プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/07/27

MSTest と Moq を使用した単体テスト

update2018/01/29 event_note2017/07/27 9:35

MSTest と Moq を使用してテストコードを書いてみました。

環境

  • Visual Studio 2017

インストール方法などは以下の記事を参照してください。

テストしたいコード

namespace Hoge
{
  public interface ICalculation
  {
    // 加算を行うメソッド
    int Add(int x, int y);
  }

  // このクラスは ICalculation に依存しているため、
  // ICalculation が実装されていないとテストができない
  // そこで Moq を使ってテストする
  public class Calculation
  {
    ICalculation hoge;

    public Calculation(ICalculation hoge)
    {
      this.hoge = hoge;
    }

    // 加算結果を2倍にして返すメソッド
    public int AddDouble(int x, int y)
    {
      return hoge.Add(x, y) * 2;
    }
  }
}

テストコード

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

namespace Hoge.Tests
{
  // Calculation のテストクラス
  [TestClass()]
  public class CalculationTests
  {
    // AddDouble のテストメソッド
    [TestMethod()]
    public void AddDoubleTest()
    {
      // AddDouble をテストするためには ICalculation の Add が実装されている必要がある
      // なので、ICalculation のモックを作成する
      var mock = new Mock<ICalculation>();

      // Add メソッドの動作を定義する
      // ここでは引数として 2 と 3 を与えた時に 5 を返すように定義している
      mock.Setup(m => m.Add(2, 3)).Returns(5);

      // モックの準備が完了したので、テストコードを書く

      // モックを引数で渡してテスト対象のクラスをインスタンス化する
      var target = new Calculation(mock.Object);

      // 実行と結果の判定
      Assert.AreEqual(10, target.AddDouble(2, 3));
    }
  }
}

参考URL