5 c# moq xunit .net-core asp.net-core
我在实体框架中有一个模型。我想确保应用程序服务正在正确读取指向数据库的通用存储库。我该如何在 Xunit 中测试这个,我有点卡住了?收到以下错误,也许我需要重写代码。需要验证应用程序服务可以读取 InMemorydatabase 中下面的示例数据行。
模型:
public partial class Department
{
public int DepartmentId { get; set; }
public string DepartmentCode { get; set; }
public string DepartmentName { get; set; }
.... plus additional
}
Run Code Online (Sandbox Code Playgroud)
数据传输对象:
public class DepartmentDto
{
public int DepartmentId { get; set; }
public string DepartmentCode { get; set; }
public string DepartmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
IRepository 的基础存储库:
public async Task<T> GetAsync(int id)
{
return await Table.FindAsync(id);
}
**Constructor:**
public BaseRepository(DbContext context)
{
_context = context;
Table = _context.Set<T>();
}
Run Code Online (Sandbox Code Playgroud)
服务:DepartmentAppService.cs
public async Task<DepartmentDto> GetDepartmentById(int id)
{
var department = await departmentRepository.GetAsync(id);
var departmentDto = mapper.Map<Department, DepartmentDto>(department);
return departmentDto;
}
**Constructor:**
public DepartmentAppService(IRepository<Department> departmentRepository, IMapper mapper)
{
this.departmentRepository = departmentRepository;
this.mapper = mapper;
}
Run Code Online (Sandbox Code Playgroud)
尝试的测试代码:
public async Task Get_DepartmentById_Are_Equal()
{
var options = new DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
var context = new TestContext(options);
Mock<IRepository<Department>> departmentRepositoryMock = new Mock<IRepository<Department>>();
Mock<IMapper> mapperMock = new Mock<IMapper>();
Mock<DepartmentAppService> departmentAppServiceMock = new Mock<DepartmentAppService>(departmentRepositoryMock, mapperMock);
context.Department.Add(new Department { DepartmentId = 2, DepartmentCode = "123", DepartmentName = "ABC" });
var test = await departmentAppServiceMock.GetDepartmentById(5);
Assert.Equal("123", test.DepartmentCode);
Run Code Online (Sandbox Code Playgroud)
接收错误:如何修复?
'Mock<DepartmentAppService>' does not contain a definition for 'GetDepartmentById' and no accessible extension method 'GetDepartmentById' accepting a first argument of type 'Mock<DepartmentAppService>' could be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)
程序中也有依赖注入。允许根据需要重写代码,
您不想创建DepartmentAppService. 您想要创建一个实例。您正在测试的方法需要真实对象的实例,而不是模拟对象。您想要测试实际对象的代码,模拟不运行任何代码,而只返回假数据。
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile(sharedServicesProfile);
});
mapper = config.CreateMapper();
var departmentAppService = new DepartmentAppService(departmentRepositoryMock.Object, mapperMock.Object);
Run Code Online (Sandbox Code Playgroud)
如果您正在使用 InMemory 数据库,并且实际上是从该 InMemory 数据库获取存储库的数据,那么您也不想模拟您的存储库,因为您正在访问物理数据库并返回真实数据而不是模拟数据。
老实说,我认为您需要更多地阅读有关测试和模拟的内容。看起来缺少一些核心概念......这是编写您想要做的事情的一种方式。
AutoMapper.Mapper.Initialize(m => m.AddProfile<YOUR AUTOMAPPER PROFILE>());
AutoMapper.Mapper.AssertConfigurationIsValid();
var options = new DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
var context = new TestContext(options))
context.Department.Add(new Department { DepartmentId = 2, DepartmentCode = "123", DepartmentName = "ABC" });
context.SaveChanges();
var departmentRepository = new Repository<Department>>(context);
var departmentAppService = new DepartmentAppService(departmentRepository, mapper);
var test = await departmentAppService.GetDepartmentById(5);
Assert.Equal("123", test.DepartmentCode);
Run Code Online (Sandbox Code Playgroud)
您可能还需要考虑处理您的上下文或将其包装在 using 中。如果复制粘贴后代码无法正确运行,则可能需要进行一些调整,但它应该相当接近。
从上面的代码中可以看出,您仍然需要学习何时进行模拟,何时不进行模拟!不需要模拟。您还在进行集成测试,如果您不想进行集成测试,您可以删除上下文内容并模拟存储库并设置模拟以返回部门。
| 归档时间: |
|
| 查看次数: |
7335 次 |
| 最近记录: |