Reputation: 1635
Want to write unit test for HttpTrigger GET. Have method signature as follow:
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
HttpRequestMessage request,
ILogger log)
here, ILogger
is type of Microsoft.Extensions.Logging.
How to write unit test case with this injection,
Tried to create stub of ILogger
using below stuff but this needs LoggerFactory
.
public class LoggerWriter : Microsoft.Extensions.Logging.Logger<ILogger>
{
public LoggerWriter() : base() // this needs logger factory.
{
}
}
Any sample unit test for httptrigger azure function to overcome above issue (Ilogger
injection) is helpful.
Upvotes: 5
Views: 11506
Reputation: 54901
Similar to NKosi's answer, but for 2024, where Functions take an HttpRequest instead of an HttpRequestMessage.
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
HttpRequest request,
ILogger log)
Your test can look like
[TestMethod]
public async Task Function_Should_Return_Desired_Response()
{
// Arrange
var request = new DefaultHttpContext().Request;
var logger = Mock.Of<ILogger>(); //using Moq for example
// Act
var response = await MyFunction.Run(request, logger);
// Assert
//...assert desired behavior in the response
}
Upvotes: 1
Reputation: 1331
There's a great blog post that covers this topic :) https://medium.com/@jeffhollan/serverless-devops-and-ci-cd-part-1-f76f0357cba4
Upvotes: 4
Reputation: 247631
There really is no need to extend an implementation concern when the subject method requires an abstraction that can be easily mocked and injected.
Take following simplified example
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
HttpRequestMessage request,
ILogger log
) {
//...omitted for brevity
}
To unit test the above function in isolation, simply provide the necessary dependencies for the test to be exercised to completion and assert the expected behavior.
[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
}
Upvotes: 11