【.NET Core】MoqのQuickstartをやってみる(Miscellaneous)
概要
Miscellaneousってなんだろう?と思って調べたら「その他」とか「雑多な」とかって意味らしい。略してmisc。
テストコード
呼び出し回数に応じて戻り値や例外投げる方法とprotectedメンバーのセットアップについてですね。思ってたより雑多感はない。
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Moq.Protected; using MoqQuickstart; namespace MoqQuickstart.Tests { [TestClass] public class Miscellaneous { [TestMethod] public void setting_up_a_member_to_return_different_values_throw_exceptions_on_sequential_calls(){ var mock = new Mock<IFoo>(); mock.SetupSequence(f => f.GetCount()) .Returns(3) // will be returned on 1st invocation .Returns(2) // will be returned on 2nd invocation .Returns(1) // will be returned on 3rd invocation .Returns(0) // will be returned on 4th invocation .Throws(new InvalidOperationException()); // will be thrown on 5th invocation var foo = mock.Object; var first = foo.GetCount(); var second = foo.GetCount(); var third = foo.GetCount(); var fourth = foo.GetCount(); Assert.AreEqual(3,first); Assert.AreEqual(2,second); Assert.AreEqual(1,third); Assert.AreEqual(0,fourth); try { var fifth = foo.GetCount(); Assert.Fail(); } catch(InvalidOperationException) { Assert.IsTrue(true); } } [TestMethod] public void setting_expectations_for_protected_members() { var mock = new Mock<CommandBase>(); mock.Protected() .Setup<int>("Execute") .Returns(5); mock.Protected() .Setup<string>("Execute", ItExpr.IsAny<string>()) .Returns("foo"); Assert.AreEqual(5, mock.Object.Processing()); Assert.AreEqual("foo", mock.Object.Processed("bar")); } } }
QuickstartのページにはCommandBase
クラスの記述がないので、これも追加で。
using System; namespace MoqQuickstart { public class CommandBase { public int Processing() { return Execute(); } public string Processed(string s) { return Execute(s); } protected virtual int Execute() { return 0; } protected virtual string Execute(string s) { return "fix:" + s; } } }
テストを実行してみましょう。
$ dotnet test --filter "FullyQualifiedName~MoqQuickstart.Tests.Miscellaneous" Build started, please wait... Build completed. Test run for /Users/soil/src/github/unit-testing-using-dotnet-test/PrimeService.Tests/bin/Debug/netcoreapp2.0/PrimeService.Tests.dll(.NETCoreApp,Version=v2.0) Microsoft (R) Test Execution Command Line Tool Version 15.3.0-preview-20170628-02 Copyright (c) Microsoft Corporation. All rights reserved. テスト実行を開始しています。お待ちください... テストの合計数: 2。成功: 2。失敗:0。スキップ: 0。 テストの実行に成功しました。 テスト実行時間: 2.8108 秒
ミスレニアス?ミセレイニアス?
Miscellaneousでしょう。