Мне интересно, придумал ли кто-нибудь, как выполнять функциональное тестирование класса, реализующего 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
выше?