我不完全理解如何重构我的应用程序,使它更易测试。
我正在使用ASP.NET Core3.0 (Razor,如果这很重要)。
现状:
我有在上下文中注入(从IdentityDbContext继承的)和userManager的剃刀页面模型:
public class DashboardModel : PageModel
{
private readonly ApplicationDbContext _context;
private readonly UserManager<AVUser> _userManager;
public DashboardModel(ApplicationDbContext context, UserManager<AVUser> userManager)
{
_context = context;
_userManager = userManager;
}
public async Task<IActionResult> OnGetAsync()
{
AVUser = await _userManager.GetUserAsync(User);
MyRepository myRepository = new MyRepository(_context, AVUser);
// omitted - just getting data from the repository for use on the page
return Page();
}
我创建了存储库,其构造函数如下:
public MyRepository(ApplicationDbContext context, AVUser user)
我从不在Model类中直接使用上下文,而是使用传入的上下文在Model类中创建存储库。在本例中,ApplicationDbContext是我的EF核心上下文,AVUser是我的身份用户类型,定义为:
public class AVUser : IdentityUser
我的DI设置为:
// DB Setup
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// Identity Setup
services.AddDefaultIdentity<AVUser>(config =>
{
config.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>();
我不懂的
我想让自己的剃须刀页面模型类在不依赖数据库或存储库类的情况下具有可测试性,从而模拟存储库类,因此我希望我必须从构造函数中删除上下文,而是为我的存储库和DI创建接口。
但是,我不知道如何在Repository的用户参数中进行DI --如何在Startup.cs中设置我的服务,这样就可以传递它了?今天,为了获得这个值,我运行:
AVUser = await _userManager.GetUserAsync(User);
发布于 2019-11-14 11:38:13
如果在DI容器中注入存储库,IoC将自动注入它们的依赖项,如控制器和页面。因此,您只需要在存储库类中有这样的构造函数:
private readonly ApplicationDbContext _context;
private readonly UserManager<AVUser> _userManager;
public MyRepository(ApplicationDbContext context, UserManager<AVUser> userManager)
{
_context = context;
_userManager = userManager;
}
然后将其注入容器:
services.AddTransient<IMyRepository,MyRepository>();
仅此而已。记住为您的存储库创建一个接口,这样您就可以为生产或测试注入不同的实例。尽管如此,您不应该依赖DI进行测试。如果您正在编写单元测试,那么为您的MyRepository创建一个测试实现并简单地实例化它。如果您正在编写集成测试,那么您必须使用不同的sturtup
类。
https://stackoverflow.com/questions/58864059
复制相似问题