在终结点路由系统中将图形公开为终结点具有如下优点和缺点:
您可以轻松地向终结点添加授权。您可能不希望任何人都能查看此数据!
图形终结点显示为系统中的终结点。这显然是正确的,但可能会很烦人。
如果最后一点对您来说很重要,那么您可以使用传统的方法来创建终结点,即使用分支中间件。
将图形可视化工具添加为中间件分支在您进行终结点路由之前,将分支添加到中间件管道是创建“终结点”的最简单方法之一。它在ASP.NET Core 3.0中仍然可用,它比终结点路由系统要更为,但不能轻松添加授权或高级路由。
要创建中间件分支,请使用Map()命令。例如,您可以使用以下命令添加分支:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // add the graph endpoint as a branch of the pipeline app.Map("/graph", branch => branch.UseMiddleware<GraphEndpointMiddleware>()); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/healthz"); endpoints.MapControllers(); }); }使用此方法的优缺点在本质上与终结点路由版本相反:图形中没有/graph终结点,您无法轻松地将授权应用于此终结点!
对我来说,像这样公开应用程序的图形是没有意义的。在下一节中,我将展示如何通过小型集成测试来生成图形。
从集成测试生成终结点图ASP.NET Core对于运行内存集成测试有很好的设计,它可以在不需要进行网络调用的情况下运行完整的中间件管道和API控制器/Razor页面。
除了可以用来确认应用程序整体正确运行的传统“端到端”集成测试之外,我有时还喜欢编写“健全性检查”测试,以确认应用程序配置正确。您可以使用,在Microsoft.AspNetCore.Mvc.Testing中暴露的底层DI容器中的实现。这样,您就可以在应用程序的DI上下文中运行代码,而无需通过单元测试。
现在,让我们来试下吧
使用VS或dotnet new xunit来运行一个新的xUnit项目(我选择的测试框架)
通过运行dotnet add package Microsoft.AspNetCore.Mvc.Testing安装Microsoft.AspNetCore.Mvc.Testing
将测试项目的<Project>元素更新为<Project Sdk="Microsoft.NET.Sdk.Web">
从测试项目中引用您的ASP.NET Core项目
现在,我们可以创建一个简单的测试来生成终结点图,并将其写入测试输出。在下面的示例中,我将默认值WebApplicationFactory<>作为类基础设施;如果您需要自定义工厂,请参阅以获取详细信息。
除了WebApplicationFactory<>,我还注入了ITestOutputHelper。您需要使用此类来记录xUnit的测试输出。直接写Console不会起作用。。
public class GenerateGraphTest : IClassFixture<WebApplicationFactory<ApiRoutes.Startup>> { // Inject the factory and the output helper private readonly WebApplicationFactory<ApiRoutes.Startup> _factory; private readonly ITestOutputHelper _output; public GenerateGraphTest( WebApplicationFactory<Startup> factory, ITestOutputHelper output) { _factory = factory; _output = output; } [Fact] public void GenerateGraph() { // fetch the required services from the root container of the app var graphWriter = _factory.Services.GetRequiredService<DfaGraphWriter>(); var endpointData = _factory.Services.GetRequiredService<EndpointDataSource>(); // build the graph as before using (var sw = new StringWriter()) { graphWriter.Write(endpointData, sw); var graph = sw.ToString(); // write the graph to the test output _output.WriteLine(graph); } } }