对时间触发的 Azure 函数进行单元测试

The*_*der 5 c# unit-testing xunit azure azure-functions

我有一个时间触发的 Azure 函数,我想用 XUnit 和 MOQ 测试它。

虽然我知道我需要Run使用类的实例来调用该类的方法,但请说明funTimeTriggeredObj在哪里

funTimeTriggered funTimeTriggeredObj = new funTimeTriggered(queueSchedulerMock.Object, telemetryHelperMock.Object)
Run Code Online (Sandbox Code Playgroud)

喜欢

funTimeTriggeredObj.Run(param1, param2, loggerMock.Object) 
Run Code Online (Sandbox Code Playgroud)

在哪里

private Mock<ILogger> loggerMock = new Mock<ILogger>() 
Run Code Online (Sandbox Code Playgroud)

我不知道我应该怎么嘲笑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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 6

如果使用这些类的实际实例没有不良影响,并且您可以实际初始化它们,然后创建实际实例并将它们传递给被测函数。

如果使用实际实例没有不良影响,则它们不必是接口或模拟

//Arrange

//...omitted for brevity

var param1 = new TimerInfo(...); 
var param2 = = new ExecutionContext {
    InvocationId = Guid.NewGuid()
};

//Act
await funTimeTriggeredObj.Run(param1, param2, loggerMock.Object);

//Assert
//...assert expected behavior
Run Code Online (Sandbox Code Playgroud)

由于在这个测试用例中定时器甚至没有被函数使用,所以可以完全忽略它

//Arrange

//...omitted for brevity

var param1 = default(TimerInfo); //null
var param2 = = new ExecutionContext {
    InvocationId = Guid.NewGuid()
};

//Act
await funTimeTriggeredObj.Run(param1, param2, loggerMock.Object);

//Assert
//...assert expected behavior
Run Code Online (Sandbox Code Playgroud)