2017-10-17 14 views
0

Comment configurer Mock<UserManager<ApplicationUser>> _userManager si _userManager.FindByIdAsync(userId) va à ApplicationDbContext et trouve l'utilisateur par Id comme celui-ci _context.Users.SingleOrDefault(u=>u.Id == userId)?Comment installer Mock <UserManager <TUser >>

Mon code:

[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>())); 
} 

Je suis coincé sur moqueur FindByIdAsync. Je veux quand je teste _userManager.FindById(userId) pour retourner _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; 
    } 

} 

Comment puis-je y parvenir?

+0

La question dans son état actuel ne sait pas qu'il est incomplet. Lisez [ask] puis fournissez un [mcve] qui peut être utilisé pour mieux comprendre votre problème. – Nkosi

+0

Salut @Jones, donnez-nous et exemple de votre code de test ou collez-le complètement et nous serons en mesure de vous aider à aller dans la bonne direction. Répondez à ces commentaires et je vais jeter un coup d'œil (en passant, connaissez-vous la bibliothèque Moq?) – Juan

Répondre

1

Si je comprends bien votre question, cela devrait fonctionner pour vous:

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

En méthode déclarative vous pouvez spécifier lambda qui utilise votre paramètre d'entrée réelle.

Voir aussi MOQ: Returning value that was passed into a method