如何使用 ILogger 为 azure 函数 (Httptrigger) 编写单元测试

How to write unit test for azure function (Httptrigger) with ILogger

想要为 HttpTrigger GET 编写单元测试。 方法签名如下:

public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage request, 
    ILogger log)

这里,ILogger是Microsoft.Extensions.Logging的类型。

如何用这个注入写单元测试用例, 尝试使用以下内容创建 ILogger 的存根,但这需要 LoggerFactory.

public class LoggerWriter : Microsoft.Extensions.Logging.Logger<ILogger>
{
    public LoggerWriter() : base() // this needs logger factory.
    {
    }
}

用于克服上述问题(Ilogger 注入)的 httptrigger azure 函数的任何示例单元测试都是有帮助的。

当主题方法需要可以轻松模拟和注入的抽象时,确实没有必要扩展实现问题。

以下面的简化示例为例

public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage request, 
    ILogger log
) {
    //...omitted for brevity
}

要单独对上述功能进行单元测试,只需提供必要的依赖项即可完成测试并断言预期行为。

[TestMethod]
public async Task Function_Should_Return_Desired_Response() {
    //Arrange
    var request = new HttpRequestMessage();
    //...populate as needed for test

    var logger = Mock.Of<ILogger>(); //using Moq for example
    //...setup expected behavior

    //Act
    var response = await MyFunction.Run(request, logger);

    //Assert
    //...assert desired behavior in the response 
}

有一个很棒的博客 post 涵盖了这个主题 :) https://medium.com/@jeffhollan/serverless-devops-and-ci-cd-part-1-f76f0357cba4