2017-10-17 8 views
0

설정 방법 Mock<UserManager<ApplicationUser>> _userManager 에 그렇게 _userManager.FindByIdAsync(userId)이 ApplicationDbContext로 이동이 _context.Users.SingleOrDefault(u=>u.Id == userId) 같은 ID로 사용자를 발견?를 설치하는 방법 모의 <UserManager <TUser >>

내 코드 : 나는 FindByIdAsync을 조롱에 부착하고

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

. _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

참조하십시오. [ask]를 읽고 문제를 더 잘 이해하는 데 사용할 수있는 [mcve]를 제공하십시오. – Nkosi

+0

안녕하세요 @ 존스, 우리에게 예제 코드를 보내거나 완전히 붙여 넣으면 올바른 방향으로 갈 수 있도록 도와 줄 것입니다. 이 의견에 대한 답변과 내가 살펴 보겠습니다. (그런데, Moq 라이브러리에 익숙합니까?) – Juan

답변

1

이 당신을 위해 작동합니다 :

_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