ASP.NET Core 6 представляет упрощенную модель размещения, которую можно использовать для реализации облегченных API-интерфейсов, устраняя необходимость написания шаблонного кода, необходимого в предыдущих версиях ASP.NET Core.
В предыдущих статьях здесь и здесь мы обсуждали, как начать работу с минимальными API и как использовать ведение журналов и внедрение зависимостей с минимальными API. В этой статье обсуждается, как мы можем тестировать минимальные API в ASP.NET Core 6.
Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создайте проект веб-API ASP.NET Core в Visual Studio 2022.
Прежде всего давайте создадим проект веб-API ASP.NET Core в Visual Studio 2022. Выполнение этих шагов приведет к созданию нового проекта веб-API в Visual Studio 2022:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальные API. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект веб-API ASP.NET Core 6 для тестирования минимальных API в последующих разделах этой статьи.
Структура решения полного минимального приложения веб-API
В этом примере мы создадим два приложения с именами MinimalAPIDemo и MinimalAPIDemoTest. MinimalAPIDemo — это минимальный веб-API ASP.NET Core 6, который мы будем тестировать, а MinimalAPITests — тестовое приложение. В нашем примере MinimalAPITests будет содержать один метод тестирования для тестирования API MinimalAPIDemo.
Полная структура решения будет выглядеть так:
Рисунок 1. Полная структура решения для MinimalAPIDemo.
Создайте минимальный веб-API в ASP.NET Core 6.
Давайте теперь создадим наш минимальный веб-API в ASP.NET Core 6. Назовем его CustomerAPI. Этот клиентский API будет содержать следующие файлы:
- Клиент (это представляет класс модели)
- ICustomerRepository (представляет интерфейс клиентского репозитория)
- CustomerRepository (представляет класс клиентского репозитория, реализующий интерфейс ICustomerRepository)
Класс модели Customer
Создайте новый файл с именем 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 { }
Создайте минимальный тестовый проект веб-API в ASP.NET Core 6.
Создайте тестовый проект Xunit с именем MinimalAPIDemo.Tests и переименуйте файл модульного теста по умолчанию в 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 в действии.
Это минимальная реализация, мы не использовали базу данных или контекст данных, а просто простой класс репозитория с несколькими статическими элементами данных — ровно столько, чтобы проиллюстрировать, как мы можем создавать минимальные API и тестировать их в ASP.NET Core 6. Подробнее о минимальных API я расскажу в следующих статьях здесь.