MD9
MD9

Reputation: 117

Azure Functions unit-testing errors (TimerTrigger. HttpFunction)

I am currently following this guide (https://learn.microsoft.com/en-us/azure/azure-functions/functions-test-a-function) for adding testing to my Azure Functions application.

Currently I have built out 8 Azure Functions which all work well, I have also added a Functions.Tests project and referenced the Azure Functions project within it.

enter image description here

Here is what the Functions.Tests currently look like.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Xunit;

namespace Functions.Tests
{
public class FunctionsTests
{
    private readonly ILogger logger = TestFactory.CreateLogger();

    [Fact]
    public async void Http_trigger_should_return_known_string()
    {
        var request = TestFactory.CreateHttpRequest("name", "Bill");
        var response = (OkObjectResult)await HttpFunction.Run(request, logger);
        Assert.Equal("Hello, Bill", response.Value);
    }

    [Theory]
    [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
    public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
    {
        var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
        var response = (OkObjectResult)await HttpFunction.Run(request, logger);
        Assert.Equal($"Hello, {queryStringValue}", response.Value);
    }

    [Fact]
    public void Timer_should_log_message()
    {
        var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
        TimerTrigger.Run(null, logger);
        var msg = logger.Logs[0];
        Assert.Contains("C# Timer trigger function executed at", msg);
    }
}
}

However I am getting the following errors within FunctionsTests.cs

enter image description here

I have tried all the suggested fixes from Visual Studio and checked resources online but with no luck. Perhaps I am missing a reference? I'm not sure as I have followed the guide word for word.

Example Azure Function used:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Exemplar
{
public static class getCase
{
    [FunctionName("getCase")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/case/caseId")] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

}

Upvotes: 1

Views: 1319

Answers (2)

Nkosi
Nkosi

Reputation: 247098

Assuming provided project that contains the function is referenced, the test simply needs to arrange and exercise the target function as shown in the linked example

[Fact]
public async Task getCase_should_return_known_string()
{
    var request = TestFactory.CreateHttpRequest("name", "Bill");
    var response = (OkObjectResult)await getCase.Run(request, logger);
    Assert.Equal("Hello, Bill", response.Value);
}

[Theory]
[MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
public async Task getCase_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
{
    var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
    var response = (OkObjectResult)await getCase.Run(request, logger);
    Assert.Equal($"Hello, {queryStringValue}", response.Value);
}

Also avoid using async void. Refactor those tests to use async Task instead.

Upvotes: 1

Thiago Custodio
Thiago Custodio

Reputation: 18387

Seems to me it's missing a reference to your azure functios project, make sure you've added the reference by:

  • right clicking your test project
  • select the menu Add
  • select Reference
  • select the projects tab (left menu), then mark the checkbox of your function project
  • click ok

Upvotes: 0

Related Questions