【ハウツー】
最後に、Moqの便利なメソッド(Returns応用/AtMostOnce/Throws/Callback)について紹介します。
Moqの応用例(テストにパスします)
[TestMethod()]
public void EtcTest()
{
//(1)戻り値に変数を使用(Returns応用)
var mock1 = new Mock<IGreeting>();
string returnWord = "こんにちは";
mock1.Setup(m => m.Print("変数")).Returns(() => returnWord);
Assert.AreEqual("こんにちは", mock1.Object.Print("変数"));
returnWord = "おはよう";
Assert.AreEqual("おはよう", mock1.Object.Print("変数"));
//(2)1回のみ呼び出し可(AtMostOnce)
var mock2 = new Mock<IGreeting>();
mock2.Setup(m => m.Print("1回"))
.Returns("こんにちは").AtMostOnce();
Assert.AreEqual("こんにちは", mock2.Object.Print("1回"));
//もう一度Print("1回")を呼び出すとエラー
//(3)例外の発生(Throws)
var mock3 = new Mock<IGreeting>();
mock3.Setup(m => m.Print("例外")).Throws<ArgumentException>();
//mock3.Object.Print("例外")を呼び出すとArgumentException
//(4)処理の呼び出し(Callback)
var mock4 = new Mock<IGreeting>();
string log = string.Empty;
mock4.Setup(m => m.Print(It.IsAny<string>()))
.Callback(() => Console.WriteLine("呼び出し"))
.Returns("こんにちは")
.Callback>string>(s => log += s);
Assert.AreEqual("こんにちは", mock4.Object.Print("1回目"));
Assert.AreEqual("こんにちは", mock4.Object.Print("2回目"));
Assert.AreEqual("1回目2回目",log);
}
(1)の「Returns(() => returnWord)」ですが、これは戻り値にreturnWordという変数を使うように指定しています。これで戻り値を実行時に決定することができます。また変数に限らず「Returns((string s) => s + "あああ");」というように式を書くこともできます。
(2)では「AtMostOnce」と記述しています。これはメソッドを呼び出せる回数を1回に制限しています(2回目の呼び出しからはエラーとなります)。同様のメソッド「AtMost(n)」では、n+1回目からエラーとなります。
(3)の「Throws」では例外を設定しています。指定したメソッドを呼び出した時に例外が発生します。「Throws(new ArgumentException())」と書いても同様です。
(4)の「Callback」では任意の処理を記述できます。メソッド呼び出しのタイミングで、ログを出力したり、計算を行ったりすることができます。
モックを積極的に活用すると、依存関係が複雑なクラスのテストを容易に書くことができます。例えば注文クラスの単体テストを書く時、依存する注文明細クラスや顧客クラスにモックを使用できます。
モックを使わない場合、単体テストというより結合テストに近くなってしまうことがあります。また、単体テストの内容が重複してしまうこともあります。モックを使えば、ターゲットクラスのテストに集中することができます。テストクラスのセットアップメソッドをシンプルにできるため、テストメソッド間の依存度を下げることもできます。
テスト時に、実クラスを使うかモックを使うかの判断は状況によって変わってきますが、モックという選択肢を知っておくことで、ユニットテストの設計に柔軟性を持たせることができます。
本稿では紹介しきれませんでしたが、Moqには、イベントのRaiseメソッド、引数のoutパラメータ、refパラメータ指定といった便利な機能も備わっています。興味を持たれた方は、ぜひMoqをダウンロードして試してみてはいかがでしょうか。
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
心理学のプロのお墨付き。本当に怖いホラー映画とは? [09:30 5/27] ホビー |
|
下田麻美、待望の1stシングルが6月27日発売! ジャケ写を紹介 [09:10 5/27] ホビー |
|
【連載】読む鉄道、観る鉄道 第9回 『サブウェイ・パニック』 - 1970年代のニューヨークと地下鉄の情景を描く [08:00 5/27] ライフ |
|
【連載】発音も聞けちゃう、知って得するidiom情報 第14回 call it a day [08:00 5/27] ライフ |
|
MINI、ロールスロイスにインスパイアされた最高級品質の特別仕様車を発売 [07:30 5/27] ライフ |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。