1.21 jigowatts

Great Scott!

【.NET Core】MoqのQuickstartをやってみる(Callbacks)

概要

MoqのQuickstartをやってみる。Callbackメソッドについてです。

github.com

環境
  • macOS Sierra バージョン 10.12.6
  • .NET Core 2.0
  • Moq 4.7.137

テストコード

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 秒