Как выполнить функциональное тестирование Azure функций? - PullRequest
0 голосов
/ 07 мая 2020

Мне интересно, придумал ли кто-нибудь, как выполнять функциональное тестирование класса, реализующего Azure Функции.

Во-первых, есть эта хорошая статья о том, как установить тестирование для класса функции, созданного шаблоном проекта Visual Studio (2019) Azure Functions. Проблема в том, что моя реализация Azure Functions использует внедрение зависимостей и не может использовать классы stati c, подобные тем, которые были созданы в новом проекте Azure Functions. В моей реализации используется класс Startup, аналогичный тому, что вы найдете в этой статье about Azure Функции с внедрением зависимостей.

Я включил простой метод функции, который возвращает системная версия. Вот как выглядят Startup и функциональные классы:

[assembly: FunctionsStartup(typeof(SomeNamespace.FunctionApp.Startup))]
namespace SomeNamespace.FunctionApp
{
    public sealed class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSomeService(); // IServiceCollection extension method defined elsewhere.
        }
    }

    public class SomeFunctions
    {
        public SomeFunctions(IConfiguration configuration, ISomeService someService)
        {
            _someService = someService;

            Version currVersion = GetType().Assembly.GetName().Version;
            _systemVersion = new Version(currVersion.Major, currVersion.Minor, configuration.GetValue<Int32>("BuildId")).ToString();
        }

        private readonly ISomeService _someService;
        private readonly String _systemVersion;

        [FunctionName("SystemVersion")]
        public ActionResult<String> SystemVersion([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "SomeFunctions/SystemVersion")] HttpRequest req)
        {
            return new JsonResult(_systemVersion) { StatusCode = (Int32)HttpStatusCode.OK };
        }
    }
}

Для справки, вот как выглядит функциональный тестовый класс для проекта веб-API, реализующего класс контроллера. Обратите внимание, что приведенный ниже класс Startup похож, но отличается от класса Startup, используемого для класса SomeFunctions.

namespace SomeNamespace.WebAPI.Controllers
{
    public sealed class TestSomeController : IClassFixture<WebApplicationFactory<Startup>>
    {
        public TestSomeController(WebApplicationFactory<Startup> factory)
        {
            _client = factory.CreateClient();
        }

        private readonly HttpClient _client;

        [Fact]
        public async Task Get()
        {
            var httpResponse = await _client.GetAsync("api/SomeRoute");
            Assert.Equal(HttpStatusCode.OK, httpResponse.StatusCode);
        }
    }
}

Я пытаюсь найти способ что-то сделать аналогично классу SomeFunctions выше. Если я сделаю что-то похожее на реализацию проекта веб-API, описанного выше, я получаю следующее сообщение об ошибке:

System.InvalidOperationException: 'Указанный тип Startup не принадлежит сборке с записью точка. Распространенной причиной этой ошибки является предоставление типа из библиотеки классов. '

Как я могу реализовать класс функционального тестирования для Azure функций в реализации SomeFunctions выше?

1 Ответ

0 голосов
/ 12 мая 2020

Мне удалось найти отличную статью о том, как выполнять интеграционное тестирование с Azure функциями. Эта реализация тестирования не является полностью функциональным тестом, при котором HTTP-запрос отправляется на URL-адрес, но ее достаточно, чтобы протестировать весь стек приложения из области реализации Azure метода функции внутрь.

Суть тестового класса выглядит так:

namespace SomeNamespace.FunctionApp
{
    public sealed class TestSomeFunctions
    {
        public TestSomeFunctions()
        {
            var startup = new Startup();
            var host = new HostBuilder()
                .ConfigureWebJobs(startup.Configure)
                .Build();

            _someFunctions = new SomeFunctions(SomeFunctions);
        }

        private readonly SomeFunctions _someFunctions;

        [Fact]
        public void SystemVersion()
        {
            var request = new DefaultHttpRequest(new DefaultHttpContext());
            JsonResult jsonResult = _someFunctions.SystemVersion(request).Result as JsonResult;
            Assert.Equal((Int32)HttpStatusCode.OK, jsonResult.StatusCode);
        }
    }
}
...