2016-07-28 9 views
5

Wyśmiałem klasy abstrakcyjne, aby przetestować konkretną metodę klasy w następujący sposób.Jak wyśmiewać UserManager i RoleManager dla testu jednostkowego

var mock = new Mock<BaseTestController>(); 
mock.CallBase = true; 
var ta = mock.Object; 

ta.ControllerContext = new HttpControllerContext { Request = new HttpRequestMessage() };   
var owinMock = new Mock<IOwinContext>(); 
owinMock.Setup(o => o.Authentication.User).Returns(new ClaimsPrincipal()); 
owinMock.Setup(o => o.Request).Returns(new Mock<OwinRequest>().Object); 
owinMock.Setup(o => o.Response).Returns(new Mock<OwinResponse>().Object); 
owinMock.Setup(o => o.Environment).Returns(new Dictionary<string, object> { { "key1", 123 } }); 
var traceMock = new Mock<TextWriter>(); 
owinMock.Setup(o => o.TraceOutput).Returns(traceMock.Object); 

ta.Request.SetOwinContext(owinMock.Object); 
var result = await ta.ActivateDeactive("[email protected]", true); 

Problem: Moja klasa abstrakcyjna użycie Entity Framework 6 and Asp.Net Identity UserManager and RoleManager następująco

public TestUserManager UserService 
{ 
    get 
    { 
     return _userService ?? Request.GetOwinContext().GetUserManager<TestUserManager>(); 
    } 

    private set 
    { 
     _userService = value; 
    } 
} 

public TestRoleManager RoleService 
{ 
    get 
    { 
     return _roleService ?? Request.GetOwinContext().Get<TestRoleManager>(); 
    } 

    private set 
    { 
     _roleService = value; 
    } 
} 

Jak mogę kpić TestUserManager and TestRoleManager w moim powyższym kodzie kpiącym?

Próbowałem w następujący sposób, ale nie mogłem uzyskać sposób, aby podłączyć go z ControllerContext.

var userStore = new Mock<IUserStore<TestUser>>(); 
var userManager = new TestUserManager(userStore.Object); 

Odpowiedź na pytanie zadane poniżej Aleksey L.

ten sposób TestUserManager wywodzi UserManaer i wdrożenia.

public class TestUserManager : UserManager<TestUser> 
{ 
    public TestUserManager(IUserStore<TestUser> store) 
     : base(store) 
    { 
    } 
    public static TestUserManager Create(IdentityFactoryOptions<TestUserManager> options, IOwinContext context) 
    { 
     TestUserManager manager = new TestUserManager(new UserStore<TestUser>(context.Get<AuthContext>())); 
     setValidationRules(manager); 

     IDataProtectionProvider dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider == null) 
      dataProtectionProvider = new DpapiDataProtectionProvider(); 
     manager.UserTokenProvider = new DataProtectorTokenProvider<TestUser>(dataProtectionProvider.Create("ASP.NET Identity")) { TokenLifespan = TimeSpan.FromDays(expiryTime) }; 

     return manager; 
    } 

    public static TestUserManager CreateLocal(AuthContext context) 
    { 
     TestUserManager manager = new TestUserManager(new UserStore<TestUser>(context)); 
     setValidationRules(manager); 

     IDataProtectionProvider dataProtectionProvider = new DpapiDataProtectionProvider(); 
     manager.UserTokenProvider = new DataProtectorTokenProvider<TestUser>(dataProtectionProvider.Create("ASP.NET Identity")); 

     return manager; 
    } 

    private static void setValidationRules(ApplicationUserManager manager) 
    { 
     manager.UserValidator = new UserValidator<TestUser>(manager) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 

     manager.PasswordValidator = new ApplicationPasswordValidator 
     { 
      RequiredLength = 30, 
      MaximumCharacters = 30, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = true, 
      RequireLowercase = false, 
      RequireUppercase = false 
     }; 
    } 
} 

kod kontrolera

public async Task<IHttpActionResult> ActivateDeactive(string studentId, bool active) 
{ 
    IdentityResult result; 
    _accountService = new AccountMgtService(UserService, RoleService); 
    result = await _accountService.ActiveDeactiveUser(userId, active); 

} 
+0

pokazać jak kontroler używa 'UserManager' –

+0

Proszę sprawdzić mój zaktualizowany pytanie - ostatnia część odpowiedzi na swoje pytanie. – immirza

+0

Mam na myśli kod kontrolera. Kod, który wywołuje 'UserManager' –

Odpowiedz

5

Nie wiem, dlaczego jesteś wykonawczych TestUserManager a nie tylko wyśmianie go. Lat, że mamy następujący kod w kontrolerze:

var owinContext = Request.GetOwinContext(); 
var userManager = owinContext.GetUserManager<ApplicationUserManager>(); 
var applicationUser = userManager.FindById("testId"); 

można wstrzyknąć mock użytkownikowi przechowywać w ten sposób:

var owinMock = new Mock<IOwinContext>(); 

var userStoreMock = new Mock<IUserStore<ApplicationUser>>(); 
userStoreMock.Setup(s => s.FindByIdAsync("testId")).ReturnsAsync(new ApplicationUser 
{ 
    Id = "testId", 
    Email = "[email protected]" 
}); 
var applicationUserManager = new ApplicationUserManager(userStoreMock.Object); 

owinMock.Setup(o => o.Get<ApplicationUserManager>(It.IsAny<string>())).Returns(applicationUserManager); 

ta.Request.SetOwinContext(owinMock.Object); 
+0

Doskonały. Ale teraz skończyłem z innym problemem ... Dlaczego użytkownik ApplicationUser = UserManager.FindById (userId); zwraca null? mimo że identyfikator użytkownika istnieje w tabeli bazy danych? Czy muszę kpić z czegoś więcej? – immirza

+1

Oczywiście, powinieneś skonfigurować fałszywe składowanie użytkowników. Zobacz zaktualizowaną odpowiedź. Możesz też usunąć wszystkie zbędne rzeczy z pytania, aby łatwiej było je zrozumieć innym. –

+0

Doskonały Aleksey L. Nigdy nie sądziłam, że będzie to łatwe. dzięki – immirza

Powiązane problemy