c# - xUnit 测试异步事件处理程序
问题描述
我有一个使用 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);
}
但是当我运行它时,我得到一个异常,说“当前没有活动的测试”。处理此类测试的最佳方法是什么?
解决方案
您正在测试 Azure 服务总线,您在网络上发送消息并接收它。查看代码,您想验证消息是否以某种方式收缩。Message
而不是经历整个发送/接收阶段,您可以通过测试由您的代码构造来将其短路。或者,创建一个插件以在消息发送之前拦截消息。如果您坚持发送/接收,则在执行断言或超时之前,您的代码不得存在。这是因为消息处理程序是一个同步 API,它将在消息发生更改以由回调处理之前继续执行测试方法。await Task.Delay(TimeSpan.FromSeconds(5))
不保证足够。
推荐阅读
- laravel - 无效的表达式:vue js中的意外标识符
- javascript - How can I properly record a MediaStream?
- node.js - cucumber.js 步骤定义失败,第一步出现超时错误
- ios - ios 11目标c中特定时间的每日安排本地通知
- angular - 使用 TypeScript 销毁静态变量、静态数组
- html - 使用网格列和网格行的网格布局
- android-vibration - 如何让 SmartWatch 从 HTML5 页面振动而无需干预
- symfony - Symfony 使用 HTTP 基本身份验证保护
- jquery - 如何使用 jquery ajax 仅从 json 请求和获取部分数据
- postgresql - 过滤超过 10 分钟的数据