2012-05-29 14 views
17

私はSignalRのハブをテストしたいと思いますが、どのような方法が最適ですか?Unittest SignalR Hubs

  • は別のクラスに
  • 抽象ロジック
  • セレン(小さな単位をテストしたいと思います)
  • それともそれはいくつかあるがテスト可能なハブを作成します。私は今のところについて考えている

    可能な解決策SignalRテスト機能が見落とされている

現在、SignalR 0.4とNUnitをテストフレームワークとして使用しています。

答えて

4

この質問はもう少し前ですが、とにかく答えるために最善を尽くします。

実際のハブクラスに多くのロジックがある場合は、そのロジックを別のクラスに抽象化することは間違いありません。私はSignalRを搭載したマルチプレイヤーデモでも同じことをしました。ハブクラス自体に含まれる唯一の動作は、メッセージングに関連する動作です。それ以上の措置はすべて委任されるべきです。

注:これはASP .NETのコントローラ設計のガイドラインに非常によく似ています。MVC:コントローラーを小さくして実際の作業を委任します。

実際にSignalRとの統合テストを実施する場合は、selenium webdriverが適しています。しかし、おそらく、テストの文脈でSignalRメッセージングが完全に機能するように、いくつか調整を行う必要があります。正しいトラックを開始するために、 "signalr selenium"(引用符なし)のgoogle検索を行います。

SignalR =>herehere

+0

を最後にリンクが:(壊れているそれでも... –

+0

I再確認されたリンクの答えを必要とし、 –

+1

はい、Jasmine(またはSelenium)が動作しますNUnitで同じ動作をテストできるかどうか疑問に思っています –

8

このlinkのための自動テストに関するいくつかのブログ記事には、どのようにユニット部品番号を使用してテストSignalRハブ方法をに示します。あなたは、リポジトリ、クライアント、コンテキスト、および呼び出し元をモックアップします。

[TestClass] 
    public class ChatHubTests 
    { 
    private TestableChatHub _hub; 

    public void SetUpTests() 
    { 
     _hub = GetTestableChatHub(); 
    } 

    [Test] 
    public void ExampleTest() 
    { 
     SetUpTests(); 
     const string message = "test"; 
     const string connectionId = "1234"; 

     var result = _hub.Send(message); 

     _hub.MockChatRepository.Verify(r => r.SaveMessage(message, connectionId)); 
     Assert.IsTrue(result); 
    } 

    private TestableChatHub GetTestableChatHub() 
    { 
     var mockRepository = new Mock<IChatRepository>(); 
     mockRepository.Setup(m => m.SaveMessage(
      It.IsAny<string>(), It.IsAny<string())).Returns(true); 
     return new TestableChatHub(mockRepository); 
    } 
    } 

public class TestableChatHub : ChatHub 
{ 
public Mock<IChatRepository> MockChatRepository { get; private set; } 

public TestableChatHub(Mock<IChatRepository> mockChatRepository) 
    : base(mockChatRepository.Object) 
{ 
    const string connectionId = "1234"; 
    const string hubName = "Chat"; 
    var mockConnection = new Mock<IConnection>(); 
    var mockUser = new Mock<IPrincipal>(); 
    var mockCookies = new Mock<IRequestCookieCollection>(); 

    var mockRequest = new Mock<IRequest>(); 
    mockRequest.Setup(r => r.User).Returns(mockUser.Object); 
    mockRequest.Setup(r => r.Cookies).Returns(mockCookies.Object); 

    Clients = new ClientProxy(mockConnection.Object, hubName); 
    Context = new HubCallerContext(mockRequest.Object, connectionId); 

    var trackingDictionary = new TrackingDictionary(); 
    Caller = new StatefulSignalProxy(
     mockConnection.Object, connectionId, hubName, trackingDictionary); 
} 
} 

その後のサイトには、あなたはユニットテストを書くために、このテスト可能なハブを使用することができることを示しています。ここでは、サイトからコードがだ、私はそれが最新のSignalRを動作させるためにいくつかのマイナーな変更を行いました

+0

http://www.bradygaster.com/doing-bdd-with-signalr-and-jasmineをチェックできましたか?また、クライアント側のSignalR呼び出しをテストすることもできました –

+0

いいえ私はこれを見ていない。これを回答として投稿する必要があります。 –

+0

..あなたの答えをコメントに残すのではなく、改訂してください。 –

5

単体テストのSignalRハブを作成するのは簡単な方法です。注目すべきは、SignalRがdynamicクラスを使用していて、あなたのモックフレームワークでサポートされていないクラス(私はNSubstituteを使用しています)です。例えば、使用するには、この書き換え

public class ProjectsHub: Hub 
{ 
    public void AddProject(string id) 
    { 
     Clients.All.AddProject(id); 
    } 
} 

[TestFixture] 
public class ProjectsHubTests 
{ 
    // Operations that clients might receive 
    // This interface is in place in order to mock the 
    // dynamic object used in SignalR 
    public interface ISignals 
    { 
     void AddProject(string id); 
    } 

    [Test] 
    public void AddProject_Broadcasts() 
    { 
     // Arrange 
     ProjectsHub hub = new ProjectsHub(); 
     IHubCallerConnectionContext clients = 
       Substitute.For<IHubCallerConnectionContext>(); 
     ISignals signals = Substitute.For<ISignals>(); 
     SubstituteExtensions.Returns(clients.All, signals); 
     hub.Clients = clients; 

     // Act 
     hub.AddProject("id"); 

     // Assert 
     signals.Received(1).AddProject("id"); 
    } 
} 

Moqはかなりシンプルでなければなりません。

+0

MoqとXUnitで動作するように変更され、回答として掲示されました。 – Brent

0

これは、XUnitとMOQで動作するIarsmの答えの修正版です。 SignalR 2と

using Microsoft.AspNet.SignalR; 
using Microsoft.AspNet.SignalR.Hubs; 
using Moq; 
using Xunit; 

namespace TestLibrary { 
public class ProjectsHub : Hub { 
    public void AddProject(string id) { 
     Clients.All.AddProject(id); 
    } 
} 

public class ProjectsHubTests { 
    // Operations that clients might receive 
    // This interface is in place in order to mock the 
    // dynamic object used in SignalR 
    public interface ISignals { 
     void AddProject(string id); 
    } 

    [Fact] 
    public void AddProject_Broadcasts() { 
     // Arrange 
     ProjectsHub hub = new ProjectsHub(); 
     var clients = new Mock<IHubCallerConnectionContext<dynamic>>(); 
     var signals = new Mock<ISignals>(); 
     hub.Clients = clients.Object; 

     signals.Setup(m => m.AddProject(It.Is<string>(s => s == "id"))).Verifiable(); 
     clients.Setup(m => m.All).Returns(signals.Object); 

     // Act 
     hub.AddProject("id"); 

     // Assert 
     signals.VerifyAll(); 
    } 
} 

}

2

。0あなたは、このようにそれを行うことができます。

// Arrange 
var hub = new CodeInteractivePreviewHub(); 
var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); 
hub.Clients = mockClients.Object; 
dynamic all = new ExpandoObject(); 
mockClients.Setup(m => m.All).Returns((ExpandoObject)all); 

// Act 
var allSourceCodes = hub.InitiateCommunication(); //Change this line to your Hub's method 

// Assert 
Assert.IsNotNull(allSourceCodes);