在 asp.net 中使用最小起订量测试服务 class

Test service class using moq in asp.net

我有这样的服务class:

public class CategoryService: ICategoryService
{
    private myContext _context;
    public CategoryService(myContext context)
    {
         _context = context;
    }
        
    public async Task<List<CategoryDTO>> GetCategories()
    {  
            
        return (await _context.Categories.ToListAsync()).Select(c => new CategoryDTO
        {
              CategoryId = c.CategoryId, 
              CategoryName = c.CategoryName
                
        }).ToList();
    }
}

我的上下文是这样的:

public DbSet<Category> Categories {get;set;} 

我对 GetCategories() 的单元测试是:

[Fact]
public void TestGetCategories()
{      
    //Arrange
    Mock <myContext> moq = new Mock <myContext>();
 
    var moqSet = new Mock<DbSet<Category>>();
             
    moq.Setup(m => m.Categories).Returns(moqSet.Object);
                
    CategoryService service = new CategoryService(moq.Object);

    //Act
    var result = service.GetCategories();

    //Assert
    Assert.NotNull(result);

 }

但是我的单元测试出现错误。它说:

System.NotSupportedException : Unsupported expression: m => m.Categories

有人可以帮我修复设置部分吗?

您不能使用具有不可覆盖属性的最小起订量。它必须是抽象的或虚拟的,这就是您收到错误的原因。

dbcontext 属性 Categories 更改为虚拟并重试。

public virtual DbSet<Category> Categories {get;set;}

P.s。模拟接口方法时不需要这样做,因为它们本质上是可覆盖的。

我终于想通了。 正如@PeterCsala 提到的,我们可以使用“EntityFrameworkCore3Mock” 您可以在这里找到它:https://github.com/huysentruitw/entity-framework-core3-mock

我的单元测试是这样的:

public DbContextOptions<ShoppingCartContext> dummyOptions { get; } = new DbContextOptionsBuilder<ShoppingCartContext>().Options;

[Fact]
public async Task TestGetCategories()
{
     //Arrange
     var dbContextMoq = new DbContextMock<ShoppingCartContext>(dummyOptions);

     //Create list of Categories
     dbContextMoq.CreateDbSetMock(x => x.Categories, new[]
     {
         new Category { CategoryId = 1, CategoryName = "Items" },
         new Category { CategoryId = 2, CategoryName = "Fruits" }
     });

     //Act
     CategoryService service = new CategoryService(dbContextMoq.Object);
     var result = await service.GetCategories();

     //Assert
     Assert.NotNull(result);

}