Модульная проверка запускаемой по времени функции Azure - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть функция с временным срабатыванием Azure, которую я хочу проверить с помощью XUnit и MOQ.

Хотя я знаю, что мне нужно вызвать метод Run класса, используя экземпляр класса, скажем funTimeTriggeredObj, где

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;
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

Если при использовании фактического экземпляра этих классов нет нежелательных эффектов, и вы действительно можете их инициализировать, то создайте фактический экземпляр и передайте их тестируемой функции.

Они не должны быть интерфейсами или поддельными, если использование фактических экземпляров не имеет нежелательных эффектов

//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

И поскольку в этом тестовом случае таймер даже не используется функция, которую можно полностью игнорировать

//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
3 голосов
/ 01 апреля 2020

Вы можете поместить logi c вашей функции Azure в отдельный класс и написать модульные тесты для этого класса.

Что можно сделать, это интеграционный тест, если была создана другая функция с другим триггером (например, HTTP), выполняющая ту же самую вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...