【发布时间】:2018-06-16 16:48:59
【问题描述】:
我正在使用 ASP.NET Core 2.0,使用 xUnit 和 Moq 为管理功能创建单元测试。我有一个 AdminController.cs,它在其构造函数中对以下内容使用依赖注入
private UserManager<AppUser> userManager;
private IUserValidator<AppUser> userValidator;
private IPasswordValidator<AppUser> passwordValidator;
private IPasswordHasher<AppUser> passwordHasher;
private RoleManager<IdentityRole> roleManager;
private SignInManager<AppUser> signInManager;
我在单元测试中尝试按以下方式排列它们
// Arrange
Mock<EFRepository> mockRepo = new Mock<EFRepository>();
var userStoreMock = new Mock<IUserRoleStore<AppUser>>();
var userManager = new UserManager<AppUser>(userStoreMock.Object, null, null, null, null, null, null, null, null);
AppUser user = new AppUser();
var roleStoreMock = new Mock<IRoleStore<IdentityRole>>();
var userValidator = new Mock<IUserValidator<AppUser>>();
var passwordValidator = new Mock<IPasswordValidator<AppUser>>();
var passwordHasher = new Mock<IPasswordHasher<AppUser>>();
var roleManager = new RoleManager<IdentityRole>(roleStoreMock.Object, null, null, null, null, null);
var signInManager = new Mock<SignInManager<AppUser>>();
//THIS LINE CAUSES THE ERROR
AdminController controller = new AdminController(userManager, userValidator.Object, passwordValidator.Object, passwordHasher.Object, roleManager, signInManager.Object);
我收到以下错误:
Can not instantiate proxy of class: Microsoft.AspNetCore.Identity.SignInManager
Could not find a parameterless constructor.
我还没有找到合适的方法来模拟一个有效的SignInManager
我一直在尝试使用以下方法但没有成功:
private Mock<SignInManager<AppUser>> GetMockSignInManager()
{
var mockUsrMgr = GetMockUserManager();
var mockAuthMgr = new Mock<AuthenticationManager>();
var mockContextAssosor = new Mock<IHttpContextAccessor>();
var mockClaimsFactory = new Mock<IUserClaimsPrincipalFactory<AppUser>>();
//i am unclear on how to mock the options
var opts = new Mock<IOptions<>>();
var mockLogger = new Mock<ILogger<SignInManager<AppUser>>>();
//namespace for IAuthenicationSchemeProvider is not recognized
var scheme = new Mock<IAuthenticationSchemeProvider>();
//return new Mock<SignInManager<AppUser>>(mockUsrMgr.Object, mockAuthMgr.Object...and so on);
}
【问题讨论】:
-
停止将您的代码与实现问题耦合。将接口后面的那些抽象出来。
-
@Nkosi 我不太关注;你能举个例子来说明你的建议吗?我一直在尝试遵循文本 Pro ASP.NET Core MVC 2
标签: c# unit-testing moq xunit