概要
Moqの簡単な実装例の紹介 + 役に立った参考サイトのまとめ
Moqとは
Moqは単体テスト用の代替オブジェクトを簡単に作るライブラリ。
オープンソースで商用利用可能(MITライセンス)。
C#の単体テストで使用するライブラリとして、一般的なもの。
Moqの使用上の制約
- インターフェースあるいは抽象クラスを継承すること。
→ 設計段階でDependency Injection(DI)の考え方を取り入れる必要がある。
参考:DIって何のためにするのかわからない人向けに頑張って説明してみる - 静的なメソッドは代替できない
→これはの有償ツールが必要。Microsoft Fakesなど。
Moqの簡単な実装例
テスト対象クラスの作成
テスト対象クラス
using System;
namespace MoqTutorial
{
/// <summary>
/// 評価対象クラスのインターフェース
/// 参考
/// https://github.com/Moq/moq4/wiki/Quickstart
/// </summary>
public interface IFooSample
{
bool DoSomething(string value);
}
/// <summary>
/// 評価対象クラス
/// </summary>
public class FooSample : IFooSample
{
private readonly IFooSample _ifooSampleObject;
/// <summary>
/// コンストラクタ・インジェクション
/// </summary>
/// <param name="iObject"></param>
public FooSample(IFooSample iObject)
{
_ifooSampleObject = iObject;
}
public bool DoSomething(string value)
{
var result = _ifooSampleObject.DoSomething(value);
//結果に応じた処理を記載する
if (result)
{
Console.WriteLine("成功時の処理を書く");
}
else
{
Console.WriteLine("成功時の処理を書く");
}
return result;
}
}
}
テストコードの作成
テストコード
using Moq;
using MoqTutorial;
using NUnit.Framework;
namespace TestProject1
{
[TestFixture]
public class IFooSampleTest
{
[Test]
public void TestSample_Methoods()
{
//Mockを作成(インターフェースを指定)
var mock = new Mock<IFooSample>();
//関数名と戻り値を指定
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
//評価対象クラスにMockを渡す
var fooObject = new FooSample(mock.Object);
//評価対象クラスで関数コール
Assert.IsTrue(fooObject.DoSomething("ping"));
}
}
}
単体テストコード作成に関しては、Git:Moq Quickstartを参考に実装すると良いと思います。
役に立った参考サイトのまとめ
Moqの解説が参考になったもの
No | リンク | 説明 |
---|---|---|
1 | Moq : Mocking Framework for .NET | Moqの説明と実装例がセットで載っている。 Qiitaの記事の中だと、個人的に最も分かりやすかった。 |
2 | Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider | SlideShareにMoqの概要・メリットが纏められている。資料が2013年のため、少し古い。 |
Moqを用いた単体テストコードの作成に役立つもの
No | リンク | 説明 |
---|---|---|
1 | Git:Moq Quickstart | Git上にあるMoqのクイックスタートページ。Moqの使い方を詳しく解説したサイトは調べた限りだと、これだけ。 実装例とMoqの使い方が用途毎に記載されている。 |
2 | FAQ | FAQページ。 |