【发布时间】:2020-04-01 08:59:36
【问题描述】:
我有一个时间触发的 Azure 函数,我想用 XUnit 和 MOQ 进行测试。
虽然我知道我需要使用类的实例调用该类的 Run 方法,例如 funTimeTriggeredObj where
funTimeTriggered funTimeTriggeredObj = new funTimeTriggered(queueSchedulerMock.Object, telemetryHelperMock.Object)
喜欢
funTimeTriggeredObj.Run(param1, param2, loggerMock.Object)
在哪里
private Mock<ILogger> loggerMock = new Mock<ILogger>()
我不知道应该如何模拟 param1 和 param2,它们分别是 TimerInfo 和 ExecutionContext 对象。
我问的原因是因为“TimerInfo”和“ExecutionContext”都没有实现任何可以模拟的接口。
下面是我的实际功能实现。任何帮助将不胜感激。
using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
public class funTimeTriggered
{
private string _invocationID;
private readonly IQueueScheduler _queueScheduler;
private readonly ITelemetryHelper _telemetryHelper;
public funTimeTriggered(IQueueScheduler queueScheduler, ITelemetryHelper telemetryHelper)
{
_queueScheduler = queueScheduler;
_telemetryHelper = telemetryHelper;
}
[FunctionName("funTimeTriggered")]
public async Task Run([TimerTrigger("0/10 * * * * *")]TimerInfo myTimer, ExecutionContext context, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
try
{
_invocationID = context.InvocationId.ToString();
await _queueScheduler.SendEventsToServiceBusAndDeleteFromSQS();
}
catch (Exception ex)
{
log.LogError(ex.Message);
_telemetryHelper.LogException(ex);
throw ex;
}
}
}
【问题讨论】:
-
这里有一些关于当你没有你试图模拟的类的所有权时该怎么做的讨论(因此在这种情况下不能根据需要将方法/属性标记为虚拟): stackoverflow.com/questions/20400734/…
-
你真的需要模拟它们吗?它们似乎根本没有在您的代码中使用。我还认为它们都有没有副作用的公共构造函数,所以你甚至可以传入一个实际的实例。
-
Azure Function SDK 的 Azure Function Timer 触发器句柄,你不能在上面写单元测试。您应该为自己的代码编写单元测试
-
@PankajRawat 我已经为业务逻辑编写了一个单独的单元测试,我将它保存在不同的类中;这个要求是专门写一个“功能测试”
-
您将很难创建
TimerInfo的新实例,因为它需要TimerSchedule的实例,它是一个抽象类。但我只是通过伪装来避免这出戏。无论如何,您也应该伪造它,因为它并不是您真正测试的内容。您总是可以为您的方法可能从 TimerInfo 调用的某些方法伪造返回。
标签: c# azure unit-testing azure-functions xunit