Тестовый асинхронный обработчик событий xUnit - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть класс, который использует служебную шину Azure, и он в основном отправляет электронное письмо, помещая сообщение в очередь.Когда я пишу интеграционные тесты, мне нужно убедиться, что я могу получить отправленное сообщение (нет, я не тестирую служебную шину).Итак, вот код для этого:

    [Fact]
    public async Task PutEmailIntoTheQueue()
    {
        IlgQueueEmailInfo actual = new IlgQueueEmailInfo("from@address.com", "to@address.com", "subject", "test body", MessageBodyType.Text,
            "email1@domain.com",
            "email2@domain.com");

        ServiceBusConnectionStringBuilder sbcb =
            new ServiceBusConnectionStringBuilder(SERVICE_BUS_ENDPOINT_S, QUEUE_NAME_S, SAS_KEY_NAME, EMAIL_TESTS_SAS);
        QueueClient receiveClient = new QueueClient(sbcb, ReceiveMode.ReceiveAndDelete);
        bool hasBeenCalled = false;

        //
        // Check values here
        //
        async Task ReceiveMessageHandler(Message message, CancellationToken cancellationToken)
        {
            Output.WriteLine("Received Message\n");

            Assert.True(message.Label != null && message.ContentType != null &&
                        message.Label.Equals(IlgEmailQueue.MESSAGE_LABEL_S, StringComparison.InvariantCultureIgnoreCase) &&
                        message.ContentType.Equals("application/json", StringComparison.InvariantCultureIgnoreCase));

            byte[] body = message.Body;
            string msgJson = Encoding.UTF8.GetString(body);

            Output.WriteLine($"json: {msgJson}\n");

            IlgQueueEmailInfo emailInfo = JsonConvert.DeserializeObject<IlgQueueEmailInfo>(msgJson);
            Assert.NotNull(emailInfo);
            Output.WriteLine("emailInfo is not NULL");

            Assert.Equal(actual, emailInfo);
            Output.WriteLine($"emailInfo equals to actual: {actual == emailInfo}\n");

            Output.WriteLine("Setting hasBeenCalled to True");
            hasBeenCalled = true;

            await receiveClient.CompleteAsync(message.SystemProperties.LockToken);
        }

        receiveClient.RegisterMessageHandler(
            ReceiveMessageHandler,
            new MessageHandlerOptions(LogMessageHandlerException) {AutoComplete = true, MaxConcurrentCalls = 1});

        await _emailQueue.QueueForSendAsync(actual.FromAddress, actual.ToAddresses[0], actual.Subj, actual.Body, MessageBodyType.Text, actual.CcAddress,
            actual.BccAddress);

        await Task.Delay(TimeSpan.FromSeconds(5));

        Assert.True(hasBeenCalled);
    }

Но когда я запускаю его, я получаю исключение, говорящее что-то вроде: «В настоящее время нет активного теста».Как лучше всего справляться с такого рода тестами?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы тестируете служебную шину Azure таким образом, что отправляете сообщение по беспроводной сети и получаете его.Глядя на код, вы хотите убедиться, что сообщение заключено определенным образом.Вместо того, чтобы проходить через всю фазу отправки / получения, вы можете замкнуть его, просто протестировав Message, созданный вашим кодом.Или создайте плагин для перехвата сообщения непосредственно перед его отправкой.Если вы настаиваете на отправке / получении, ваш код не должен существовать до тех пор, пока утверждение не будет выполнено или не истечет время ожидания.И это из-за того, что обработчик сообщений является синхронным API, который продолжит выполнение тестового метода до , в сообщении есть изменение, которое будет обработано обратным вызовом.await Task.Delay(TimeSpan.FromSeconds(5)) не гарантируется, что будет достаточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...