代码之家  ›  专栏  ›  技术社区  ›  AlexB

XUnit测试异步事件处理程序

  •  0
  • AlexB  · 技术社区  · 6 年前

    我有一个使用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 回复  |  直到 6 年前
        1
  •  1
  •   Sean Feldman    6 年前

    你在测试Azure服务总线的方式是,你在网上发送一条消息并接收它。查看代码,您需要验证消息是否以某种方式收缩。与其经历整个发送/接收阶段,还不如通过测试 Message 由代码构造。或者,在消息发送之前创建一个插件来拦截它。如果您坚持发送/接收,则在执行断言或出现超时之前,您的代码不能存在。这是因为消息处理程序是一个同步API,将继续执行测试方法 之前 消息有一个要由回调处理的更改。 await Task.Delay(TimeSpan.FromSeconds(5)) 不能保证足够。