SignalR アプリケーションの単体テスト
作成者: Patrick Fletcher
警告
このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。
この記事では、SignalR 2 の単体テスト機能の使用について説明します。
このトピックで使用されるソフトウェアのバージョン
- Visual Studio 2013
- .NET 4.5
- SignalR バージョン 2
質問とコメント
このチュートリアルの感想、改善に関するフィードバックをページの下部にあるコメント欄にお寄せください。 チュートリアルに直接関連しない質問がある場合は、ASP.NET SignalR フォーラムまたは StackOverflow.com に投稿できます。
SignalR アプリケーションの単体テスト
SignalR 2 内の単体テスト機能を使用して、SignalR アプリケーションの単体テストを作成できます。 SignalR 2 には IHubCallerConnectionContext インターフェイスが含まれており、これを使用してテスト用のハブ メソッドをシミュレートするモック オブジェクトを作成できます。
このセクションでは、概要のチュートリアルの中で作成したアプリケーションに、XUnit.net と Moq を使用して単体テストを追加します。
XUnit.net はテストを制御するために使用します。Moq はテスト用のモック オブジェクトを作成するために使用します。 必要に応じて他のモック フレームワークを使用してもいいでしょう。NSubstitute も良い選択肢です。 このチュートリアルでは、モック オブジェクトを 2 つのやり方で設定する方法について説明します。1 つ目は dynamic
オブジェクト (.NET Framework 4 で導入) を使用し、2 つ目はインターフェイスを使用します。
内容
このチュートリアルには、次のセクションが含まれています。
Dynamic を使用した単体テスト
このセクションでは、Dynamic オブジェクトを使用して、概要のチュートリアルの中で作成したアプリケーションに単体テストを追加します。
Visual Studio 2013 の XUnit Runner 拡張機能をインストールします。
概要のチュートリアルを完了するか、MSDN コード ギャラリーから完成したアプリケーションをダウンロードします。
概要のアプリケーションのダウンロード バージョンを使用している場合は、[パッケージ マネージャー コンソール] を開き、[復元] をクリックして SignalR パッケージをプロジェクトに追加します。
単体テスト用のソリューションにプロジェクトを追加します。 [ソリューション エクスプローラー] 内でソリューションを右クリックし、[追加]、[新しいプロジェクト…] を選択します。[C#] ノードの下にある [Windows] ノードを選択します。 [ クラス ライブラリ] を選択します。 この新しいプロジェクトに「TestLibrary」という名前を付けて、[OK] をクリックします。
テスト ライブラリ プロジェクト内の参照を SignalRChat プロジェクトに追加します。 "TestLibrary" プロジェクトを右クリックし、[追加]、[参照...] を選択します。[ソリューション] ノードの下にある [プロジェクト] ノードを選択し、"SignalRChat" をオンにします。 OK をクリックします。
SignalR、Moq、XUnit のパッケージを TestLibrary プロジェクトに追加します。 [パッケージ マネージャー コンソール] 内で、[既定のプロジェクト] ドロップダウンを "TestLibrary" に設定します。 コンソール ウィンドウ内で次のコマンドを実行します。
Install-Package Microsoft.AspNet.SignalR
Install-Package Moq
Install-Package XUnit
テスト ファイルを作成します。 "TestLibrary" プロジェクトを右クリックし、[追加...]、[クラス] をクリックします。 この新しいクラスに「Tests.cs」という名前を付けます。
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
関数を呼び出します。F6 キーを押して、このソリューションをビルドします。
単体テストを実行します。 Visual Studio 内で、[テスト]、[Windows]、[テスト エクスプローラー] を選択します。 [テスト エクスプローラー] ウィンドウ内で、"HubsAreMockableViaDynamic" を右クリックし、[選択したテストの実行] を選択します。
[テスト エクスプローラー] ウィンドウの下部のペインを確認して、テストが成功したことを確認します。 このウィンドウには、テストが成功したことが表示されます。
型別の単体テスト
このセクションでは、テスト対象のメソッドを含むインターフェイスを使用して、概要のチュートリアルで作成したアプリケーションにテストを追加します。
上記の「Dynamic を使用した単体テスト」のチュートリアルの中の手順 1 から 7 を完了してください。
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
メソッドのモック バージョンが作成されます。F6 キーを押して、このソリューションをビルドします。
単体テストを実行します。 Visual Studio 内で、[テスト]、[Windows]、[テスト エクスプローラー] を選択します。 [テスト エクスプローラー] ウィンドウ内で、"HubsAreMockableViaDynamic" を右クリックし、[選択したテストの実行] を選択します。
[テスト エクスプローラー] ウィンドウの下部のペインを確認して、テストが成功したことを確認します。 このウィンドウには、テストが成功したことが表示されます。