Вызов функции Azure завершается неудачно в тесте интеграции xUnit - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть C# Программа нацеливания .NET Framework 4.7.2 и с типом вывода Консольное приложение. У меня есть файл Program.cs в качестве основной точки входа, куда я временно перемещаю свой интеграционный тест с Azure функциями. Вызов Azure функций работает как положено в Program.cs и показан ниже.

enter image description here

Исходный код функции Azure выглядит следующим образом :

#r "Newtonsoft.Json"

using System.Net;
using System.Text;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(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");
}

Теперь об ошибке.

Я использую тот же код, который вызывает Azure Функции в моих файлах Program.cs и IntegrationTest.cs, с немного отличающимися сигнатурами функций. Разница лишь в том, как я запускаю эти файлы. Для Program.cs я установил точку останова и нажал ctrl+F5, что привело меня к ожидаемому результату. Для IntegrationTest.cs я помещаю курсор в функцию, которую я хочу протестировать, нажимаю ctrl+R, затем ctrl+T, чтобы отладить тест, и в итоге оказываюсь в блоке catch, показанном на скриншоте ниже.

Неожиданное поведение, которое я вижу и нуждаюсь в некоторой помощи в этом, находится в IntegrationTest.cs, где я использую xUnit для управления своим устройством и интеграции. При вызове функции Azure в IntegrationTest.cs я получаю эту ошибку:

enter image description here

В обоих Program.cs

class Program
{
    const string azureFunctionUrl = "https://cdscryptography.azurewebsites.net/api/HttpTrigger1";

    static void Main(string[] args)
    {
        GetResponseFromAzureFunction();
    }

    static void GetResponseFromAzureFunction()
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(azureFunctionUrl);
        httpWebRequest.ContentType = "application/json; charset=utf-8";
        httpWebRequest.Method = "POST";
        string json = "";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            json = "{ \"name\" : \"Isabelle\"}";

            streamWriter.Write(json);
            streamWriter.Flush();
        }

        try {
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                Console.WriteLine(responseText);
            }
        } catch (WebException ex) {
            Console.WriteLine(ex.Message);
        }
        Console.WriteLine("Nook");
    }
}

В IntegrationTest.cs

[Fact] 
public void GetResponseFromAzureFunction()
{
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(azureFunctionUrl);
    httpWebRequest.ContentType = "application/json; charset=utf-8";
    httpWebRequest.Method = "POST";
    string json = "";
    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        json = "{ \"name\" : \"Isabelle\"}";

        streamWriter.Write(json);
        streamWriter.Flush();
    }

    try {
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            Console.WriteLine(responseText);
        }
    } catch (WebException ex) {
        Console.WriteLine(ex.Message);
    }
    Console.WriteLine("Nook");
}
...