尝试对使用模拟 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));

并且测试通过了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python:在单元测试期间尝试捕获输出时出现问题 - Unittest 库

Task <T> .Convert <TResult>扩展方法有用还是有隐患?

异步Task <TResult>-返回值

使用在 Task.Run 内调用的 Moq 方法进行单元测试

检查对象是Task还是Task <TResult>

在Visual Studio 2019 C ++中使用CPPUnitTest编写“ DivideByZero”单元测试用例时出现问题

将Task <TResult>中的TResult强制转换为System.Object

必须指定TResult的通用方法

Task <TResult> .ConfigureAwait(false)在捕获的上下文中恢复

C#中Task.FromResult <TResult>的用途是什么

为什么异步Task <TResult>总是返回空值

使用 jasmine 进行单元测试时模拟全局对象

如何使用Mockito模拟静态方法以进行单元测试

尝试从获取中模拟响应主体以进行单元测试

尝试使用asyncio时,为什么会出现“ RuntimeError:使用yield而不是Task Task中生成器的yield”的问题?

使用 Func<T,TResult> c#

CS0121 'Task.Run<TResult>(Func<TResult>)' 和 'Task.Run(Func<Task>)' 之间的调用不明确

尝试在 Python 中进行单元测试时出现“ModuleNotFoundError: No module named ...”

NullPointerException尝试模拟Elastic Search的RestHighLevelClient时出现问题

尝试使用for循环进行总体模拟

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

尝试使用cProfile时出现问题

使用业力茉莉花进行单元测试时出现控制器错误

在Raku中进行单元测试时如何模拟类方法

在对删除服务进行单元测试时,如何模拟void方法的行为?

在进行单元测试时,如何模拟异步方法的返回null?

使用googlebenchmark对简单代码进行基准测试时出现问题

Mockito InvalidUseOfMatchersException,当尝试使用自定义回调作为参数对方法进行单元测试时

尝试测试vue css样式时出现问题