我有一个定时触发的 Azure Function,想要使用 XUnit 和 MOQ 进行测试。
在我知道需要使用该类的实例(例如funTimeTriggeredObj)调用类的Run方法。
在我知道需要使用该类的实例(例如funTimeTriggeredObj)调用类的Run方法。
funTimeTriggered funTimeTriggeredObj = new funTimeTriggered(queueSchedulerMock.Object, telemetryHelperMock.Object)
像
funTimeTriggeredObj.Run(param1, param2, loggerMock.Object)
where
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;
}
}
}
TimerInfo
实例时遇到困难,因为它需要一个抽象类TimerSchedule
的实例。但是我通过伪造来避免了这个问题。你也应该这样做,因为这不是你正在测试的内容。你可以为你的方法可能从 TimerInfo 调用的某些方法伪造返回值。 - Met-u