Модульное тестирование приложений SignalR

Патрик Флетчер

Предупреждение

Эта документация не для последней версии SignalR. Взгляните на ASP.NET Core SignalR.

В этой статье описывается использование функций модульного тестирования SignalR 2.

Версии программного обеспечения, используемые в этом разделе

Вопросы и комментарии

Оставьте отзыв о том, как вам понравилось это руководство и что мы могли бы улучшить в комментариях в нижней части страницы. Если у вас есть вопросы, которые не связаны напрямую с руководством, вы можете опубликовать их на форуме ASP.NET SignalR или StackOverflow.com.

Модульное тестирование приложений SignalR

Функции модульного теста в SignalR 2 можно использовать для создания модульных тестов для приложения SignalR. SignalR 2 включает интерфейс IHubCallerConnectionContext , который можно использовать для создания макета объекта для имитации методов концентратора для тестирования.

В этом разделе вы добавите модульные тесты для приложения, созданного в руководстве по начало работы с помощью XUnit.net и Moq.

XUnit.net будет использоваться для управления тестом; Moq будет использоваться для создания макета объекта для тестирования. При необходимости можно использовать другие макетные платформы; NSubstitute также является хорошим выбором. В этом руководстве показано, как настроить макет объекта двумя способами: во-первых, с помощью dynamic объекта (представленного в платформа .NET Framework 4), а во-вторых, с помощью интерфейса.

Содержимое

Это руководство содержит следующие разделы.

Модульное тестирование с помощью Dynamic

В этом разделе вы добавите модульный тест для приложения, созданного в начало работы учебнике с помощью динамического объекта.

  1. Установите расширение XUnit Runner для Visual Studio 2013.

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

    В приведенном выше коде тестовый клиент создается с помощью Mock объекта из библиотеки Moq типа IHubCallerConnectionContext (в SignalR 2.1 присваивается dynamic параметру типа).) Интерфейс IHubCallerConnectionContext — это прокси-объект, с помощью которого вызываются методы на клиенте. Затем broadcastMessage функция определяется для макетного клиента, чтобы ее можно было вызвать классом ChatHub . Затем модуль тестирования вызывает Send метод ChatHub класса , который, в свою очередь, вызывает макетированную broadcastMessage функцию.

  9. Выполните сборку решения, нажав клавишу F6.

  10. Выполните модульный тест. В Visual Studio выберите Тест, Windows, Тест Обозреватель. В окне Test Обозреватель щелкните правой кнопкой мыши HubsAreMockableViaDynamic и выберите Выполнить выбранные тесты.

    Снимок экрана: элемент HubsAreMockableViaDynamic, выбранный в окне Test Обозреватель (Тестирование Обозреватель).

  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 метода, для которого модуль тестирования создаст макет клиента. Затем создается макет клиента с помощью Mock объекта типа IHubCallerConnectionContext (в SignalR 2.1 присваивается dynamic параметру типа). Интерфейс IHubCallerConnectionContext — это прокси-объект, с помощью которого вызываются методы на клиенте.

    Затем тест создает экземпляр ChatHub, а затем создает макетную версию broadcastMessage метода, которая, в свою очередь, вызывается путем вызова Send метода в концентраторе.

  3. Выполните сборку решения, нажав клавишу F6.

  4. Выполните модульный тест. В Visual Studio выберите Тест, Windows, Тест Обозреватель. В окне Test Обозреватель щелкните правой кнопкой мыши HubsAreMockableViaDynamic и выберите Выполнить выбранные тесты.

    Снимок экрана: элемент HubsAreMockableViaType, выбранный в окне тестового Обозреватель.

  5. Убедитесь, что тест пройден, проверив нижнюю панель в окне Тест Обозреватель. В окне будет показано, что тест пройден.

    Снимок экрана: пройденный модульный тест по типу.