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

作成者: Patrick Fletcher

警告

このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。

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

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

質問とコメント

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

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

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

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

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

内容

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

動的を使用した単体テスト

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

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

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

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

    パッケージの復元

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

    テスト ライブラリを作成する

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

    プロジェクト参照の追加

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

    • Install-Package Microsoft.AspNet.SignalR

    • Install-Package Moq

    • Install-Package XUnit

      パッケージのインストール

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

  8. Tests.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] を右クリックし、[選択したテストの実行] を選択します。

    [テスト エクスプローラー] ウィンドウで [HubsAreMockableViaDynamic] が選択されていることを示すスクリーンショット。

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

    動的オブジェクトを使用した単体テストが成功したことを示すスクリーンショット。

種類別の単体テスト

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

  1. 上記の「動的を使用した 単体テスト 」チュートリアルの手順 1 から 7 を完了します。

  2. Tests.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インスタンスが作成され、 メソッドの broadcastMessage モック バージョンが作成されます。その後、ハブで メソッドを Send 呼び出すことによって呼び出されます。

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

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

    [テスト エクスプローラー] ウィンドウで選択されている HubsAreMockableViaType を示すスクリーンショット。

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

    種類別の単体テストに合格したことを示すスクリーンショット。