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 도 좋은 선택입니다. 이 자습서에서는 두 가지 방법으로 모의 개체를 설정하는 방법을 보여 줍니다. 첫째, 개체(.NET Framework 4에서 도입됨)를 사용하고dynamic, 두 번째는 인터페이스를 사용합니다.

콘텐츠

이 자습서에는 다음 섹션이 포함되어 있습니다.

동적을 사용한 단위 테스트

이 섹션에서는 동적 개체를 사용하여 시작 자습서에서 만든 애플리케이션에 대한 단위 테스트를 추가합니다.

  1. Visual Studio 2013 대한 XUnit Runner 확장을 설치합니다.

  2. 시작 자습서를 완료하거나 MSDN 코드 갤러리에서 완료된 애플리케이션을 다운로드합니다.

  3. 시작 애플리케이션의 다운로드 버전을 사용하는 경우 패키지 관리자 콘솔을 열고 복원을 클릭하여 SignalR 패키지를 프로젝트에 추가합니다.

    패키지 복원

  4. 단위 테스트를 위해 솔루션에 프로젝트를 추가합니다. 솔루션 탐색기 솔루션을 마우스 오른쪽 단추로 클릭하고 추가, 새 프로젝트...를 선택합니다. C# 노드 아래에서 Windows 노드를 선택합니다. 클래스 라이브러리를 선택합니다. 새 프로젝트 이름을 TestLibrary로 지정하고 확인을 클릭합니다.

    테스트 라이브러리 만들기

  5. 테스트 라이브러리 프로젝트의 참조를 SignalRChat 프로젝트에 추가합니다. TestLibrary 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가, 참조...를 선택합니다. 솔루션 노드에서 프로젝트 노드를 선택하고 SignalRChat을 검사. 확인을 클릭합니다.

    프로젝트 참조 추가

  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, 테스트 Explorer 선택합니다. 테스트 Explorer 창에서 HubsAreMockableViaDynamic을 마우스 오른쪽 단추로 클릭하고 선택한 테스트 실행을 선택합니다.

    테스트 Explorer 창에서 선택한 HubsAreMockableViaDynamic을 보여 주는 스크린샷

  11. 테스트 Explorer 창에서 아래쪽 창을 확인하여 테스트가 통과되었는지 확인합니다. 테스트가 통과되었음을 창에 표시합니다.

    동적 개체를 사용한 단위 테스트가 통과되었음을 보여 주는 스크린샷

유형별 단위 테스트

이 섹션에서는 테스트할 메서드가 포함된 인터페이스를 사용하여 시작 자습서에서 만든 애플리케이션에 대한 테스트를 추가합니다.

  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 인터페이스는 클라이언트에서 메서드를 호출하는 프록시 개체입니다.

    그런 다음, 테스트는 의 ChatHubinstance 만든 다음 메서드의 모의 broadcastMessage 버전을 만듭니다. 그러면 허브에서 메서드를 Send 호출하여 호출됩니다.

  3. F6 키를 눌러 솔루션을 빌드합니다.

  4. 단위 테스트를 실행합니다. Visual Studio에서 테스트, Windows, 테스트 Explorer 선택합니다. 테스트 Explorer 창에서 HubsAreMockableViaDynamic을 마우스 오른쪽 단추로 클릭하고 선택한 테스트 실행을 선택합니다.

    테스트 Explorer 창에서 선택한 HubsAreMockableViaType을 보여 주는 스크린샷

  5. 테스트 Explorer 창에서 아래쪽 창을 확인하여 테스트가 통과되었는지 확인합니다. 테스트가 통과되었음을 창에 표시합니다.

    형식별 단위 테스트가 통과되었음을 보여 주는 스크린샷