【.NET Core】MoqのQuickstartをやってみる(Callbacks)
概要
MoqのQuickstartをやってみる。Callback
メソッドについてです。
テストコード
Callback
メソッドの使い方に関しては特に何もないですね。そのまま使えばいいと思うmo(^q^)
using System; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using MoqQuickstart; namespace MoqQuickstart.Tests { [TestClass] public class Callbacks { [TestMethod] public void callback() { var expected = 2; var mock = new Mock<IFoo>(); var calls = 0; mock.Setup(foo => foo.DoSomething("ping")) .Returns(true) .Callback(() => calls++); var f = mock.Object; f.DoSomething("ping"); f.DoSomething("pong"); f.DoSomething("ping"); Assert.AreEqual(expected, calls); } [TestMethod] public void access_invocation_arguments() { var expected = new List<string>(){"foo", "bar", "baz"}; var mock = new Mock<IFoo>(); var callArgs = new List<string>(); mock.Setup(foo => foo.DoSomething(It.IsAny<string>())) .Returns(true) .Callback((string s) => callArgs.Add(s)); var f = mock.Object; f.DoSomething("foo"); f.DoSomething("bar"); f.DoSomething("baz"); CollectionAssert.AreEqual(expected, callArgs); } [TestMethod] public void calalternate_equivalent_generic_method_syntax() { var expected = new List<string>(){"foo", "bar", "baz"}; var mock = new Mock<IFoo>(); var callArgs = new List<string>(); mock.Setup(foo => foo.DoSomething(It.IsAny<string>())) .Returns(true) .Callback<string>(s => callArgs.Add(s)); var f = mock.Object; f.DoSomething("foo"); f.DoSomething("bar"); f.DoSomething("baz"); CollectionAssert.AreEqual(expected, callArgs); } [TestMethod] public void access_arguments_for_methods_with_multiple_parameters() { var expected = new List<string>(){"foo", "bar", "baz"}; var mock = new Mock<IFoo>(); var callArgs = new List<string>(); mock.Setup(foo => foo.DoSomething(It.IsAny<int>(), It.IsAny<string>())) .Returns(true) .Callback<int, string>((i, s) => callArgs.Add(s)); var f = mock.Object; f.DoSomething(1, "foo"); f.DoSomething(2, "bar"); f.DoSomething(3, "baz"); CollectionAssert.AreEqual(expected, callArgs); } [TestMethod] public void callbacks_can_be_specified_before_and_after_invocation() { var mock = new Mock<IFoo>(); mock.Setup(foo => foo.DoSomething("ping")) .Callback(() => Console.WriteLine("Before returns")) .Returns(true) .Callback(() => Console.WriteLine("After returns")); var actual = mock.Object.DoSomething("ping"); Assert.IsFalse(actual); } } }
テストを実行してみましょう。callbacks_can_be_specified_before_and_after_invocation
はテスト失敗時に標準出力メッセージが確認できますね。
$ dotnet test --filter "FullyQualifiedName~MoqQuickstart.Tests.Callbacks" 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. テスト実行を開始しています。お待ちください... 失敗 MoqQuickstart.Tests.Callbacks.callbacks_can_be_specified_before_and_after_invocation エラー メッセージ: Assert.IsFalse failed. スタック トレース: at MoqQuickstart.Tests.Callbacks.callbacks_can_be_specified_before_and_after_invocation() in /Users/soil/src/github/unit-testing-using-dotnet-test/PrimeService.Tests/Callbacks.cs:line 100 標準出力メッセージ: Before returns After returns テストの合計数: 5。成功: 4。失敗:1。スキップ: 0。 テストの実行に失敗しました。 テスト実行時間: 2.4901 秒