微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试对使用模拟 Task<TResult> 的方法进行单元测试时出现问题

如何解决尝试对使用模拟 Task<TResult> 的方法进行单元测试时出现问题

我正在尝试对使用 FCM 发送一些通知方法进行单元测试。此方法采用批次列表,并为每个批次创建一个 IBatchResponse 任务,其中 IBatchResponse 是我制作的接口,因此我可以模拟返回类型发送通知的实际服务。然后使用 Task.WhenAny() 我正在处理完成的任务。

 public static async Task<NotificationRes> SendPushNotifications(List<Batch> batches,INotificationService notificationService)
    {
        var notificationTasks = new List<Task<IBatchResponse>>();

        try
        {

            foreach (var batch in batches) 
            {
               notificationTasks.Add(notificationService.SendNotification(guardTokens,"android"));

            }
            while (notificationTasks.Count > 0)
            {
                var finishedTask = await Task.WhenAny(notificationTasks);
                var taskIndex = notificationTasks.Findindex(task => task == finishedTask);
                notificationTasks.Remove(finishedTask);
                var finishedTaskResult = await finishedTask;
                for (int i = 0; i < finishedTaskResult.Responses.Count; i++)
                {
                                      ....
                }
               
        }
        catch (Exception)
        {

            throw;
        }

    }

这里是我正在尝试进行的测试的代码。我模拟了发送通知的包装服务和 notificationService.SendNotification (IBatchResponse) 的返回类型。

  [Test]
    public async Task SendPushNotifications_test()
    {
        ...
        var batchSendResponses = new List<ISendResponse>();
        
        ....
        var mockNotifService = new Mock<INotificationService>();
        var mockBatchRes = new Mock<IBatchResponse>();
        mockBatchRes.Setup(res => res.Responses).Returns(batchSendResponses);
        var task = Task.Fromresult(mockBatchRes.Object);
        mockNotifService.Setup(ns => ns.SendNotification(new string[5] { "token1","token2","","" },"android")).Returns(task);


        var notRes = await Utils.SendPushNotifications(batches,mockNotifService.Object);

    }

问题是,如果存在 2 个批次,则完成的任务结果始终为空,但如果我有 1 个批次,则它可以工作。我在这里遗漏了什么。

解决方法

我发现了 mockNotifService.Setup() 方法中的问题。

mockNotifService.Setup(ns => ns.SendNotification(new string[5] { "token1","token2","","" },"android")).Returns(task);

目前在 ns.SendNotification() 中,我正在对参数进行硬编码,这似乎会影响返回的任务,或者它不会生成我在 .Returns() 中指定的任务并生成一个没有结果的空任务。所以我把它改成:

mockNotifService.Setup(ns => ns.SendNotification(It.IsAny<string []>(),It.IsAny<string>())).Returns(Task.FromResult(mockBatchRes.Object));

测试通过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?