【问题标题】:Mock an Admin Controller for Unit Testing模拟单元测试的管理控制器
【发布时间】: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


【解决方案1】:
private Mock<SignInManager<AppUser>> GetMockSignInManager()
{
    var mockUsrMgr = new UserManager<AppUser>(userStoreMock.Object, null, null, null, null, null, null, null, null);
    var ctxAccessor = new HttpContextAccessor();
    var mockClaimsPrinFact = new Mock<IUserClaimsPrincipalFactory<AppUser>>();
    var mockOpts = new Mock<IOptions<IdentityOptions>>();
    var mockLogger = new Mock<ILogger<SignInManager<AppUser>>>();

    return new Mock<SignInManager<AppUser>>(mockUsrMgr.Object, ctxAccessor, mockClaimsPrinFact.Object, mockOpts.Object, mockLogger.Object);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2014-07-30
    • 2015-03-15
    • 2012-08-01
    • 2014-01-16
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多