ASP.NET Core 6允许我们创建包括最低限度的文件、功能和依赖性的API。下面是如何测试一个最小的Web API。
ASP.NET Core 6引入了一个简化的托管模型,可以用来实现轻量级的API,无需编写以前版本的ASP.NET Core所要求的模板代码。
我们在之前的文章中讨论了如何开始使用最小的API,以及如何在最小的API中使用日志和依赖注入,这里和这里。这篇文章讨论了我们如何在ASP.NET Core 6中测试最小的API。
要使用本文提供的代码示例,你的系统中应该安装有Visual Studio 2022。如果你还没有副本,你可以在这里下载Visual Studio 2022。
在Visual Studio 2022中创建一个ASP.NET Core Web API项目
首先,让我们在Visual Studio 2022中创建一个ASP.NET Core Web API项目。按照这些步骤将在Visual Studio 2022中创建一个新的Web API项目:
- 启动Visual Studio 2022 IDE。
- 点击 "创建新项目"。
- 在 "创建新项目 "窗口,从显示的模板列表中选择 "ASP.NET Core Web API"。
- 点击 "下一步"。
- 在 "配置你的新项目 "窗口中,指定新项目的名称和位置。
- 根据你的喜好,可以选择勾选 "将解决方案和项目放在同一目录下 "复选框。
- 点击 "下一步"。
- 在接下来显示的 "附加信息 "窗口中,取消勾选 "使用控制器... "的复选框,因为在这个例子中我们将使用最小的API。将 "验证类型 "保留为 "无"(默认)。
- 确保 "启用Docker"、"为HTTPS配置 "和 "启用开放API支持 "的复选框不被选中,因为我们不会在这里使用任何这些功能。
- 点击创建。
我们将使用这个ASP.NET Core 6 Web API项目,在本文的后续部分测试最小的API。
完整的最小Web API应用程序的解决方案结构
在这个例子中,我们将建立两个应用程序,命名为MinimalAPIDemo和MinimalAPIDemoTest。MinimalAPIDemo是我们要测试的最小的ASP.NET Core 6 Web API,而MinimalAPITests是测试应用程序。在我们的例子中,MinimalAPITests将包含一个测试方法来测试MinimalAPIDemo的API。
完成后的解决方案结构将是这样的:
IDG
图1.MinimalAPIDemo的完整解决方案结构。
在ASP.NET Core 6中创建一个最小的Web API
现在让我们在ASP.NET Core 6中创建我们的最小Web API。我们将它命名为CustomerAPI。这个客户API将有以下文件:
- Customer(这代表模型类)
- ICustomerRepository(这代表客户资源库接口)
- CustomerRepository(这代表实现ICustomerRepository接口的客户库类)。
客户模型类
创建一个名为Customer.cs的新文件,并赋予其以下代码:
namespace MinimalAPIDemo
{
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Phone { get; set; }
}
}
ICustomerRepository接口
现在创建一个名为ICustomerRepository.cs的文件并插入这段代码:
namespace MinimalAPIDemo
{
public interface ICustomerRepository
{
public Task<List<Customer>> GetCustomers();
}
}
CustomerRepository类
接下来创建一个名为CustomerRepository.cs的文件并插入以下代码:
namespace MinimalAPIDemo
{
public class CustomerRepository : ICustomerRepository
{
private readonly List<Customer> _authors;
public CustomerRepository()
{
_authors = new List<Customer>
{
new Customer
{
Id = 1,
FirstName = "Joydip",
LastName = "Kanjilal",
Address = "ABC Hills",
City = "Hyderabad",
Country= "India",
Phone = "0123456789"
},
new Customer
{
Id = 2,
FirstName = "Anand",
LastName = "Narayanaswamy",
Address = "XYZ Hills",
City = "Thiruvananthapuram",
Country= "India",
Phone = "1234567890"
},
new Customer
{
Id = 3,
FirstName = "Charles",
LastName = "Fisher",
Address = "Dawson Road",
City = "New York ",
Country= "US",
Phone = "1234567890"
}
};
}
public async Task<List<Customer>> GetCustomers()
{
return await Task.FromResult(_authors);
}
}
}
Program.cs文件
在Program.cs文件中写下以下代码来创建端点:
app.MapGet("/customers", async (ICustomerRepository customerRepository) => await customerRepository.GetCustomers());
为了简单起见,我们在这个例子中只创建一个端点。添加一个ICustomerRepository类型的实例作为一个范围服务,如下图所示:
builder.Services.AddScoped<ICustomerRepository, CustomerRepository>();
你还应该添加一个名为Program的局部类。这是因为Program.cs文件将被编译成一个私有类Program,它不能从程序集的外部访问:
public partial class Program { }
这个局部类将使任何引用这个程序集的项目都能访问Program类。下面给出了Program.cs文件的完整源代码供你参考:
using MinimalAPIDemo;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<ICustomerRepository, CustomerRepository>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapGet("/customers", async (ICustomerRepository customerRepository) => await customerRepository.GetCustomers());
app.Run();
public partial class Program { }
在ASP.NET Core 6中创建一个最小的Web API测试项目
创建一个名为MinimalAPIDemo.Tests的Xunit测试项目,并将默认的单元测试文件重命名为MinimalAPITests.cs。这里是你应该编写你的测试方法的地方。在这个例子中,我们将只创建一个测试方法来测试我们先前创建的端点。
现在让我们用下面的代码编写一个名为GetAllCustomersTest的测试方法:
[Fact]
public async void GetAllCustomersTest()
{
await using var application = new WebApplicationFactory<Program>();
using var client = application.CreateClient();
var response = await client.GetAsync("/customers");
var data = await response.Content.ReadAsStringAsync();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
下面给出了MinimalAPITests类的完整源代码供你参考:
using Microsoft.AspNetCore.Mvc.Testing;
using System.Net;
using Xunit;
namespace MinimalAPIDemo.Tests
{
public class MinimalAPITests
{
[Fact]
public async void GetAllCustomersTest()
{
await using var application = new
WebApplicationFactory<Program>();
using var client = application.CreateClient();
var response = await client.GetAsync("/customers");
var data = await response.Content.ReadAsStringAsync();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
}
当你执行该测试方法时,/customers端点的响应应该如下图2所示。
图2.运行中的MinimalAPITests测试方法。
作为一个最小的实现,我们没有使用数据库或数据上下文,而只是使用了一个简单的存储库类和一些静态数据元素--这足以说明我们如何在ASP.NET Core 6中构建最小的API并测试它们。在这里,我将在未来的文章中对最小的API有更多的发言权。