! . . Album Hình . . !

Tìm kiếm Những Gì Bạn Thích !

26 tháng 8, 2025

How to write unit test for EF.Functions.ILike

 public async Task<List<CategoryMapping>> SearchAdvantage(GetCategoryMappingRequest request)

{

    using var uow = GetUow();

    var repo = GetRepository(uow);

    var query = repo.GetQueryable();

    if (!string.IsNullOrEmpty(request.Keyword))

    {

        var keyword = $"%{request.Keyword}%";


        query = query.Where(c =>

           EF.Functions.ILike(c.Title, keyword) ||

            (c.Parent != null && EF.Functions.ILike(c.Parent.Title, keyword))

        );

    }


    query = query.OrderBy(d => d.Title);

    return await query.ToListAsync();

}


1. Add the NuGet packages

dotnet add package Testcontainers.PostgreSql

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

dotnet add package Microsoft.EntityFrameworkCore

dotnet add package Microsoft.EntityFrameworkCore.Design

dotnet add package xunit

dotnet add package Moq



2. Setup the test class

using Xunit;

using Microsoft.EntityFrameworkCore;

using Testcontainers.PostgreSql;

using System;

using System.Threading.Tasks;

using System.Collections.Generic;

using System.Linq;

public class CategoryMappingServiceAdvantageTests : IAsyncLifetime

{

    private PostgreSqlContainer _postgresContainer;

    private AdminPortalDBContext _context;

    private CategoryMappingService _service;


    public async Task InitializeAsync()

    {

        // Start a PostgreSQL test container

        _postgresContainer = new PostgreSqlBuilder()

            .WithDatabase("testdb")

            .WithUsername("postgres")

            .WithPassword("postgres")

            .Build();


        await _postgresContainer.StartAsync();


        // Setup DbContext with Npgsql

        var options = new DbContextOptionsBuilder<AdminPortalDBContext>()

            .UseNpgsql(_postgresContainer.GetConnectionString())

            .Options;


        _context = new AdminPortalDBContext(options);

        await _context.Database.EnsureCreatedAsync();


        // Seed test data

        var parent = new CategoryMapping { Id = Guid.NewGuid(), Title = "Electronics" };

        var child = new CategoryMapping { Id = Guid.NewGuid(), Title = "Phone", Parent = parent };


        _context.CategoryMappings.AddRange(parent, child);

        await _context.SaveChangesAsync();


        // Setup service with factory/delegate

        Func<IUnitOfWorkServiceFactory, IUnitOfWorkService> uowResolver =

            factory => factory.GetAdminPortalUowService();


        var uowFactoryMock = new Moq.Mock<IUnitOfWorkServiceFactory>();

        uowFactoryMock.Setup(f => f.GetAdminPortalUowService())

                      .Returns(new UnitOfWorkService(_context));


        _service = new CategoryMappingService(uowFactoryMock.Object, uowResolver);

    }


    public async Task DisposeAsync()

    {

        await _postgresContainer.StopAsync();

        _context.Dispose();

    }


    [Fact]

    public async Task SearchAdvantage_ShouldReturnResult_WhenKeywordMatchesParentTitle()

    {

        // Arrange

        var request = new GetCategoryMappingRequest { Keyword = "Electronics" };


        // Act

        var results = await _service.SearchAdvantage(request);


        // Assert

        Assert.True(results.Count >= 2);

        Assert.Contains(results, d => d.Title == "Phone");

    }


    [Fact]

    public async Task SearchAdvantage_ShouldReturnResult_WhenKeywordMatchesTitle()

    {

        // Arrange

        var request = new GetCategoryMappingRequest { Keyword = "Phone" };


        // Act

        var results = await _service.SearchAdvantage(request);


        // Assert

        Assert.Single(results);

        Assert.Equal("Phone", results.First().Title);

    }

}


Không có nhận xét nào:

Hướng dẫn đăng nhận xét của bạn

  • Nếu muốn đăng nhận xét của mình các bạn click vào "Xem và nhận xét ở đây" dưới mỗi bài đăng, sau đó hộp thoại xuất hiện bạn gõ vào những nhận xét của mình. thế là xong! cảm ơn các bạn đã ghé thăm blog của mình !