در مقاله قبل به بررسی مثالی از نوشتن تست واحد پرداختیم. در این مطلب می‌خواهیم به پیاده سازی تست برای APIها بپردازیم با استفاده از کتابخانه xUnit. برای این کار ابتدا یک پروژه از نوع Asp.Net Core Web App ایجاد می‌کنیم. سپس یک کنترلر به نام UsersController ایجاد میکنیم که اطلاعات یک کاربر را نمایش می‌‎دهد. در صورتی که آیدی ارسالی مربوط به کاربر اشتباه باشد و در دیتابیس وجود نباشد، باید 404 برگشت داده شود. برای اینکار ابتدا مدل User را ایجاد میکنیم:

public class UserModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

سپس یک منبع برای دریافت دیتای کاربر ایجاد میکنیم. در این مثال چون هدف ما تست‌های API می‌باشد از یک منبع استاتیک استفاده می‌کنیم:

public static class UserDataSource
{
    public static List<UserModel> Users
    {
        get
        {
            return new List<UserModel>
            {
                new UserModel
                {
                    Id = 1,
                    Name = "Farhad"
                },
                new UserModel
                {
                    Id  = 2,
                    Name = "Himan"
                },
                new UserModel
                {
                    Id  = 2,
                    Name = "Moji"
                }
            };
        }
    }
}

سپس یک سرویس برای دریافت اطلاعات کاربر را اضافه می‌کنیم که شامل دو متد GetAll و GetById می‌باشد:

public class UserService : IUserService
{
    public List<UserModel> GetUsers()
    {
        return UserDataSource.Users;
    }
    public UserModel GetById(int id)
    {
        var user = UserDataSource.Users
            .Where(a => a.Id == id)
           .FirstOrDefault();

        return user;
    }
}

در ادامه کنترلر مربوط به User را ایجاد میکنیم:

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    private readonly IUserService _userService;

    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet]
    public List<UserModel> Get()
    {
        return _userService.GetUsers();
    }

    [HttpGet("{id:int}")]
    public IActionResult GetById(int id)
    {
        var user = _userService.GetById(id);

        if (user is null)
            return NotFound();

        return Ok(user);
    }
}

در API دریافت اطلاعات کاربر با استفاده از id درصورتی که اطلاعات کاربر یافت نشود باید ریسپانس کد 404 دریافت شود. برای این کار ابتدا یک پروژه جدید از نوع xUnit Test Project ایجاد کنید. ابتدا باید رفرنس پروژه Asp.Net Core Web App که ایجاد کرده بودید را در این پروژه اضافه کنید. سپس برای ارسال ریکوئست به کنترلر Users نیاز به یک HttpClient داریم. برای تست کردن APIها نیاز به یک HttpClient داریم که بتوانیم ریکوئست‌ها را ارسال کنیم و همچنین پروژه‌ای که می‌خواهیم برای آن تست بنویسیم نیز اجرا شود. کتابخانه Microsoft.AspNetCore.Mvc.Testing این امکانات را به ما می‌دهد. کلاس WebApplicationFactory که در کتابخانه Microsoft.AspNetCore.Mvc.Testing قرار دارد یک تایپ جنریک دریافت می‌کند که باید کلاس Startup پروژه‌ی ایجاد شده را به آن بدهیم تا پروژه را اجرا کند و HttpClient مربوط به آن را در اختیار ما قرار دهد. در ادامه باید یک کلاس تست با نام UserControllerTest ایجاد کنیم که <WebApplicationFactory<Startup را از طریق سازنده آن دریافت کند و توسط متد CreateClient یک HttpClient در اختیار ما قرار می‌دهد که ریکوئست‌ها را به آدرس localhost ارسال می‌کند که پروژه Asp.Net Core Web App را اجرا کرده است:

public class UsersControllerTest : IClassFixture<WebApplicationFactory<Startup>>
{
    private readonly WebApplicationFactory<Startup> _factory;

    public UsersControllerTest(WebApplicationFactory<Startup> factory)
    {
        _factory = factory;
    }

    [Fact]
    public async Task When_IdIsNotValid_Then_NotFoundStatusCodeShouldBeReturned()
    {
        var httpClient = _factory.CreateClient();

        var userResponse = await httpClient.GetAsync($"/api/users/{-1}");

        userResponse.StatusCode.Should().Be(HttpStatusCode.NotFound);
    }
}

در ادامه یک تست نوشته‌ایم که ابتدا HttpClient را ایجاد می‌کند و سپس به آدرس api/users/-1/ ریکوئست ارسال می‌کند و چون آیدی ارسالی در منبع داده موجود نمی‌باشد باید ریسپانس کد 404 دریافت شود.بررسی ریسپانس از پکیج FluentAssertion استفاده شده است که کار تست نویسی را راحت تر می‌کند. به همین صورت می‌توانیم برای تمامی APIها تست بنویسیم. به طور مثال اگر کاربر لاگین نباشد باید ریسپانس کد 401 دریافت شود و یا در صورتی که آیدی کاربر معتبر باشد، باید اطلاعات مربوط به کاربر در API برگردانده شود.
کدهای این مقاله را می‌توانید از گیت‌هاب دانلود کنید.

;)

Powered by Froala Editor

نظرات