次の方法で共有


SignalR アプリケーションの単体テスト

作成者: Patrick Fletcher

警告

このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。

この記事では、SignalR 2 の単体テスト機能の使用について説明します。

このトピックで使用されるソフトウェアのバージョン

質問とコメント

このチュートリアルの感想、改善に関するフィードバックをページの下部にあるコメント欄にお寄せください。 チュートリアルに直接関連しない質問がある場合は、ASP.NET SignalR フォーラムまたは StackOverflow.com に投稿できます。

SignalR アプリケーションの単体テスト

SignalR 2 内の単体テスト機能を使用して、SignalR アプリケーションの単体テストを作成できます。 SignalR 2 には IHubCallerConnectionContext インターフェイスが含まれており、これを使用してテスト用のハブ メソッドをシミュレートするモック オブジェクトを作成できます。

このセクションでは、概要のチュートリアルの中で作成したアプリケーションに、XUnit.netMoq を使用して単体テストを追加します。

XUnit.net はテストを制御するために使用します。Moq はテスト用のモック オブジェクトを作成するために使用します。 必要に応じて他のモック フレームワークを使用してもいいでしょう。NSubstitute も良い選択肢です。 このチュートリアルでは、モック オブジェクトを 2 つのやり方で設定する方法について説明します。1 つ目は dynamic オブジェクト (.NET Framework 4 で導入) を使用し、2 つ目はインターフェイスを使用します。

内容

このチュートリアルには、次のセクションが含まれています。

Dynamic を使用した単体テスト

このセクションでは、Dynamic オブジェクトを使用して、概要のチュートリアルの中で作成したアプリケーションに単体テストを追加します。

  1. Visual Studio 2013 の XUnit Runner 拡張機能をインストールします。

  2. 概要のチュートリアルを完了するか、MSDN コード ギャラリーから完成したアプリケーションをダウンロードします。

  3. 概要のアプリケーションのダウンロード バージョンを使用している場合は、[パッケージ マネージャー コンソール] を開き、[復元] をクリックして SignalR パッケージをプロジェクトに追加します。

    Restore Packages

  4. 単体テスト用のソリューションにプロジェクトを追加します。 [ソリューション エクスプローラー] 内でソリューションを右クリックし、[追加][新しいプロジェクト…] を選択します。[C#] ノードの下にある [Windows] ノードを選択します。 [ クラス ライブラリ] を選択します。 この新しいプロジェクトに「TestLibrary」という名前を付けて、[OK] をクリックします。

    Create Test Library

  5. テスト ライブラリ プロジェクト内の参照を SignalRChat プロジェクトに追加します。 "TestLibrary" プロジェクトを右クリックし、[追加][参照...] を選択します。[ソリューション] ノードの下にある [プロジェクト] ノードを選択し、"SignalRChat" をオンにします。 OK をクリックします。

    Add Project Reference

  6. SignalR、Moq、XUnit のパッケージを TestLibrary プロジェクトに追加します。 [パッケージ マネージャー コンソール] 内で、[既定のプロジェクト] ドロップダウンを "TestLibrary" に設定します。 コンソール ウィンドウ内で次のコマンドを実行します。

    • Install-Package Microsoft.AspNet.SignalR

    • Install-Package Moq

    • Install-Package XUnit

      Install Packages

  7. テスト ファイルを作成します。 "TestLibrary" プロジェクトを右クリックし、[追加...][クラス] をクリックします。 この新しいクラスに「Tests.cs」という名前を付けます。

  8. Test.cs の内容を次のコードで置き換えます。

    using System;
    using Xunit;
    using SignalRChat;
    using Microsoft.AspNet.SignalR.Hubs;
    using Moq;
    using System.Dynamic;
    
    namespace TestLibrary
    {
        public class Tests
        {
            [Fact]
            public void HubsAreMockableViaDynamic()
            {
                bool sendCalled = false;
                var hub = new ChatHub();
                var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
                hub.Clients = mockClients.Object;
                dynamic all = new ExpandoObject();
                all.broadcastMessage = new Action<string, string>((name, message) => {
                    sendCalled = true;
                });
                mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
                hub.Send("TestUser", "TestMessage");
                Assert.True(sendCalled);
            }
        }
    }
    

    上記のコード内では、テスト クライアントは IHubCallerConnectionContext 型の、Moq ライブラリの Mock オブジェクトを使用して作成されます (SignalR 2.1 では、この型パラメーターに dynamic を割り当てます)。IHubCallerConnectionContext インターフェイスは、クライアント上でメソッドを呼び出すプロキシ オブジェクトです。 それから、モック クライアントに対して broadcastMessage 関数が定義され、ChatHub クラスでそれを呼び出すことができます。 それから、テスト エンジンは ChatHub クラスの Send メソッドを呼び出すのに続けて、モックされた broadcastMessage 関数を呼び出します。

  9. F6 キーを押して、このソリューションをビルドします。

  10. 単体テストを実行します。 Visual Studio 内で、[テスト][Windows][テスト エクスプローラー] を選択します。 [テスト エクスプローラー] ウィンドウ内で、"HubsAreMockableViaDynamic" を右クリックし、[選択したテストの実行] を選択します。

    Screenshot showing HubsAreMockableViaDynamic selected in the Test Explorer window.

  11. [テスト エクスプローラー] ウィンドウの下部のペインを確認して、テストが成功したことを確認します。 このウィンドウには、テストが成功したことが表示されます。

    Screenshot showing the unit test using a dynamic object has passed.

型別の単体テスト

このセクションでは、テスト対象のメソッドを含むインターフェイスを使用して、概要のチュートリアルで作成したアプリケーションにテストを追加します。

  1. 上記の「Dynamic を使用した単体テスト」のチュートリアルの中の手順 1 から 7 を完了してください。

  2. Test.cs の内容を次のコードで置き換えます。

    using Xunit;
    using SignalRChat;
    using Microsoft.AspNet.SignalR.Hubs;
    using Moq;
    
    namespace TestLibrary
    {
        public class Tests
        {
           
           public interface IClientContract
           {
               void broadcastMessage(string name, string message);
           }
           [Fact]
           public void HubsAreMockableViaType()
           {
               var hub = new ChatHub();
               var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
               var all = new Mock<IClientContract>();
               hub.Clients = mockClients.Object;
               all.Setup(m => m.broadcastMessage(It.IsAny<string>(), 
                    It.IsAny<string>())).Verifiable();
               mockClients.Setup(m => m.All).Returns(all.Object);
               hub.Send("TestUser", "TestMessage");
               all.VerifyAll();
           }
        }
    }
    

    上記のコード内では、テスト エンジンがモック クライアントを作成する broadcastMessage メソッドのシグネチャを定義するインターフェイスが作成されます。 それから、IHubCallerConnectionContext 型の Mock オブジェクトを使用してモック クライアントが作成されます (SignalR 2.1 では、この型パラメーターに dynamic を割り当てます)。IHubCallerConnectionContext インターフェイスは、クライアント上でメソッドを呼び出すプロキシ オブジェクトです。

    それから、テストによって ChatHub のインスタンスが作成され、次にハブ上の Send メソッドの呼び出しに続いて呼び出される broadcastMessage メソッドのモック バージョンが作成されます。

  3. F6 キーを押して、このソリューションをビルドします。

  4. 単体テストを実行します。 Visual Studio 内で、[テスト][Windows][テスト エクスプローラー] を選択します。 [テスト エクスプローラー] ウィンドウ内で、"HubsAreMockableViaDynamic" を右クリックし、[選択したテストの実行] を選択します。

    Screenshot showing HubsAreMockableViaType selected in the Test Explorer window.

  5. [テスト エクスプローラー] ウィンドウの下部のペインを確認して、テストが成功したことを確認します。 このウィンドウには、テストが成功したことが表示されます。

    Screenshot showing the unit test by type has passed.