Với SignalR mình đã có 1 bài viết để xây dựng ứng dụng Chat đơn giản, bạn có thể tham khảo tại đây: https://viblo.asia/le.cong.phuc/posts/DZrGNDRDkVB Hôm nay mình sẽ cùng các bạn tìm hiểu về tính năng kiểm thử đơn vị trong ứng dụng SignalR 2. Trong SignalR 2 có bao gồm cả IHubCallerConnectionContext interface, cái mà có thể sử dụng để tạo mock object cho công việc kiểm thử.

Trong bài viết này có sử dụng 2 thư viện XUnit.net và Moq

XUnit.net sẽ được sử dụng để điều khiển test; Moq sẽ được sử dụng để tạo mock object. Ngoài ra chúng ta cũng có thể sử dụng mocking framework khác như NSubstitute cũng là một sự lựa chọn không tồi.

Unit testing với Dynamic

Bước 1

Cài đặt XUnit Runner extension cho Visual Studio

Bước 2

Tải code mẫu chúng ta sẽ kiểm thử tại đây: http://code.msdn.microsoft.com/SignalR-Getting-Started-b9d18aa9

Bước 3

Mở Package Manager Console và chọn Restore để thêm gói SignalR vào dự án

Bước 4

Thêm một dự án vào solution cho unit test. Chuột phải vào solution của bạn trong Solution Explorer và chọn Add, New Project… Chọn Visual C# -> Windows -> Class Library. Đặt tên dự án mới là TestLibrary và nhấn OK

Bước 5

Thêm thư viện của dự án TestLibrary vào dự án SignalRChat

Bước 6

Thêm các gói thư viện SignalR, Moq và XUnit vào dự án TestLibrary. Trong Package Manager Console chạy các lệnh sau trong cửa sổ console:

  • Install-Package Microsoft.AspNet.SignalR
  • Install-Package Moq
  • Install-Package XUnit

Bước 7

Tạo file test. Chuột phải vào dự án TestLibrary và chọn Add…, Class. Đặt tên class mới là Test.cs

Bước 8

Thay thế nội dung của file Test.cs với đoạn code sau:

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);
        }
    }
}

Bước 9

Build dự án bằng cách nhấn F6

Bước 10

Chạy unit test. Trong Visual Studio, chọn Test, Windows, Test Explorer. Trong cửa sổ Test Explorer, chuột phải chọn HubsAreMockableViaDynamic và chọn ** Run Selected Tests**.

Bước 11

Chờ 1 lúc bạn sẽ thấy kết quả test.

Unit testing theo loại

Bước 1-7:

Bạn vẫn thực hiện các bước này như Unit testing với Dynamic

Bước 8:

Thay thế nội dung file Tests.cs với nội dung code sau:

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();
       }
    }
}

Bước 9:

Build solution bằng cách nhấn F6

Bước 10:

Chạy unit test. Trong Visual Studio, chọn Test, Windows, Test Explorer. Trong cửa sổ Test Explorer, chuột phải chọn HubsAreMockableViaType và chọn ** Run Selected Tests**.

Bước 11:

Chờ một lúc bạn sẽ thấy kết quả test.

Như vậy bạn đã có thể xây dựng unit test cho ứng dụng SignalR. Bài viết được dịch từ https://www.asp.net/signalr/overview/testing-and-debugging/unit-testing-signalr-applications Cảm ơn các bạn đã đọc bài, hẹn các bạn vào bài sau.