在 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);
}
我有这样的服务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);
}