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

use*_*357 3 nunit mstest dependency-injection azure-functions azure-functions-runtime

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

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

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

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

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

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

Nko*_*osi 7

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

采取以下简化示例

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

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

[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 
}
Run Code Online (Sandbox Code Playgroud)