如何设置模拟<的UserManager >

如何设置模拟<的UserManager <TUser >>

问题描述:

如何设置Mock<UserManager<ApplicationUser>> _userManager 所以_userManager.FindByIdAsync(userId)去ApplicationDbContext,发现了被标识这样_context.Users.SingleOrDefault(u=>u.Id == userId)用户?如何设置模拟<的UserManager <TUser >>

我的代码:

[TestClass] 
public class AccountControllerTest 
{ 
    private ApplicationDbContext _context; 
    private Mock<UserManager<ApplicationUser>> _userManager; 
    private IHostingEnvironment _enviroment; 
    private Referrals _referrals; 
    private Mock<IEmailSender> _emailSender; 
    private Mock<IUserNameGenerator> _userNameGenerator; 
    private Mock<IUrlHelper> _urlHelper; 
    private Mock<SignInManager<ApplicationUser>> _signInManager; 
    private TimeSpan _startTrialTime; 

    [TestInitialize] 
    public void Init() 
    { 
     _userManager = UserManagerAndDbMocker.GetMockUserManager(); 
     _context = UserManagerAndDbMocker.ContextInMemoryMocker(); 
     _enviroment = new HostingEnvironment() { EnvironmentName = "Development" }; 
     _referrals = new Referrals(_context, _userManager.Object); 
     _emailSender = new Mock<IEmailSender>(); 
     _userNameGenerator = new Mock<IUserNameGenerator>(); 
     _urlHelper = new Mock<IUrlHelper>(); 
     _signInManager = new Mock<SignInManager<ApplicationUser>>(); 

     UserManagerSetup(); 
    } 


private void UserManagerSetup() 
    { 
     _userManager.Setup(um => um.CreateAsync(
      It.IsAny<ApplicationUser>(), 
      It.IsAny<string>())) 
      .Returns(Task.FromResult(IdentityResult.Success)); 

     _userManager.Setup(um => um.ConfirmEmailAsync(
      It.IsAny<ApplicationUser>(), 
      It.IsAny<string>())) 
      .Returns(
      Task.FromResult(IdentityResult.Success)); 
     _userManager.Setup(um => um.FindByIdAsync(It.IsAny<string>())); 
} 

我被困在嘲讽FindByIdAsync。我想在我测试_userManager.FindById(userId)时返回_context.Users.SingleOrDefault(u=>u.Id == userId)

public static class UserManagerAndDbMocker 
{ 
    public static Mock<UserManager<ApplicationUser>> GetMockUserManager() 
    { 
     var userStoreMock = new Mock<IUserStore<ApplicationUser>>(); 
     return new Mock<UserManager<ApplicationUser>>(
      userStoreMock.Object, null, null, null, null, null, null, null, null); 
    } 

    public static ApplicationDbContext ContextInMemoryMocker() 
    { 
     var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>(); 
     optionsBuilder.UseInMemoryDatabase(); 
     var context = new ApplicationDbContext(optionsBuilder.Options); 

     return context; 
    } 

} 

我该如何做到这一点?

+0

在当前状态下的问题是,目前还不清楚,因为它是不完整的。阅读[问],然后提供[mcve],可用于更好地理解您的问题。 – Nkosi

+0

Hi @Jones,给我们和你的测试代码的例子或完全粘贴它,我们将能够帮助你走向正确的方向。回答这个意见,我会看看(顺便说一句,你是否熟悉Moq图书馆?) – Juan

如果我正确理解你的问题,这应该为你工作:

_userManager 
    .Setup(um => um.FindByIdAsync(It.IsAny<string>())) 
    .Returns((string userId) => _context.Users.SingleOrDefault(u => u.Id == userId)); 

的回报方法,你可以指定使用您的实际输入参数拉姆达。

又见MOQ: Returning value that was passed into a method