【发布时间】:2020-08-22 02:10:46
【问题描述】:
我想知道是否有人知道如何对实现 Azure Functions 的类执行功能测试。
首先,nice article 介绍了如何为 Visual Studio (2019) Azure Functions 项目模板生成的函数类设置测试。问题是我的 Azure Functions 实现使用依赖注入,不能使用像在新 Azure Functions 项目中生成的静态类。我的实现使用了一个 Startup 类,它类似于您在 this article 中找到的关于带有依赖注入的 Azure Functions 的内容。
我已经包含了一个返回系统版本的简单函数方法。 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 };
}
}
}
作为参考,这是实现控制器类的 Web API 项目的功能测试类的样子。请注意,下面列出的Startup 类与用于SomeFunctions 类的Startup 类相似但不同。
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 类做类似的事情。如果我执行类似于上述 Web API 项目的实现,我会收到以下错误消息:
System.InvalidOperationException: '提供的类型'Startup'不属于具有入口点的程序集。这个错误的一个常见原因是从类库中提供了一个类型。'
如何在上面的SomeFunctions 实现中为 Azure Functions 实现功能测试类?
【问题讨论】:
-
只需在您的测试中实例化函数类。
var functions = new SomeFunctions(configMock, someServiceMock);并调用函数var result = functions.SystemVersion(request); -
我希望功能测试是使用真实服务和运行一些真实测试用例的系统全栈测试。这就是我使用常规 Web API 所做的事情。再说一次,如果我不能让它工作,我可能会按照你的描述做,直接创建函数类的实例并使用模拟服务调用它。
标签: .net-core dependency-injection azure-functions xunit functional-testing