Как протестировать минимальные API в ASP.NET Core 6

автор vadim


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:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальные API. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

Мы будем использовать этот проект веб-API ASP.NET Core 6 для тестирования минимальных API в последующих разделах этой статьи.

Структура решения полного минимального приложения веб-API

В этом примере мы создадим два приложения с именами MinimalAPIDemo и MinimalAPIDemoTest. MinimalAPIDemo — это минимальный веб-API ASP.NET Core 6, который мы будем тестировать, а MinimalAPITests — тестовое приложение. В нашем примере MinimalAPITests будет содержать один метод тестирования для тестирования API MinimalAPIDemo.

Полная структура решения будет выглядеть так:

минимальная демо-версия API 01ИДГ

Рисунок 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 ниже.

минимальная демо-версия API 02 ИДГ

Рисунок 2. Тестовый метод MinimalAPITests в действии.

Это минимальная реализация, мы не использовали базу данных или контекст данных, а просто простой класс репозитория с несколькими статическими элементами данных — ровно столько, чтобы проиллюстрировать, как мы можем создавать минимальные API и тестировать их в ASP.NET Core 6. Подробнее о минимальных API я расскажу в следующих статьях здесь.

Related Posts

Оставить комментарий