2015-02-21 2 views
5

Я пытаюсь высмеять метод UserStore CreateAsync для хранения в памяти пользователя.Как скомпоновать идентификатор Asp.net UserManager's CreateAsync метод

public void Can_Create_User() 
{ 
    //Arrange 
    var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "[email protected]" }; 
    var mockStore = new Mock<IUserStore<ApplicationUser>>(); 

    var userManager = new UserManager<ApplicationUser>(mockStore.Object); 
    mockStore.Setup(x => x.CreateAsync(dummyUser)) 
       .Returns(Task.FromResult(IdentityResult.Success)); 


    //Act 
    Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser); 
    var user = userManager.FindByName("PinkWarrior"); 

    //Assert 
    Assert.AreEqual("PinkWarrior", user.UserName); 
} 

The user выше всегда пустой, потому что я никогда не вставляя его. Итак, проблема у меня - Как я могу сделать userManager, который не является издевательством, возвращающим пользователя из моего магазина-макета?

This answer был несколько схожим, но не ответил на мой вопрос здесь.

Любая помощь очень ценится

ответ

13

Вам нужно издеваться вызовом FindByNameAsync, потому что это то, что будет вызывать UserManager:

public void Can_Create_User() 
{ 
    //Arrange 
    var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "[email protected]" }; 
    var mockStore = new Mock<IUserStore<ApplicationUser>>(); 

    var userManager = new UserManager<ApplicationUser>(mockStore.Object); 
    mockStore.Setup(x => x.CreateAsync(dummyUser)) 
       .Returns(Task.FromResult(IdentityResult.Success)); 

    mockStore.Setup(x => x.FindByNameAsync(dummyUser.UserName)) 
       .Returns(Task.FromResult(dummyUser)); 


    //Act 
    Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser); 
    var user = userManager.FindByName("PinkWarrior"); 

    //Assert 
    Assert.AreEqual("PinkWarrior", user.UserName); 
} 

Однако, я считаю, с таким тестом вы проверяете Microsoft.AspNet.Identity.UserManager, а не код. Что вы доказываете, так это то, что UserManager каким-то образом вызывает ваш mockStore.

Source code for Microsoft.AspNet.Identity содержит эти типы испытаний.

+0

Спасибо, ваш код работал, и тест проходит сейчас, поэтому вы получаете бонусные очки :) yayy. Я понимаю, что тестирование UserManager бессмысленно, но я изначально собирался издеваться над ним, не задумываясь. –

2

Ваш издевались магазин пользователя не подготовлен правильно. Поскольку это макет, вы не должны ожидать, что mockStore.Object.CreateAsync что-нибудь предпримет, т. Е. Он будет добавлять что угодно в любом месте.

Вам необходимо подготовить соответствующую операцию «читать», так как, вероятно, пользовательский менеджер вызовет ее. (настройте метод FindByNameAsync на макет, чтобы вернуть нужный вам идентификатор).

В любом случае то, что вы пытаетесь сделать, бессмысленно, поскольку вы пытаетесь протестировать класс UserManager.

Возможно, вам действительно нужно высмеять сам пользовательский менеджер и использовать этот макет в вашем контроллере или везде, где вы используете этот пользовательский менеджер.

4

Проверьте MockHelper.cs класс от тестов в Identity мерзавца репо

Identity GitHub repo link или Closed Issue for mocking

Вы должны найти вдохновение в отношении издевается там, например

public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class 
    { 
     store = store ?? new Mock<IUserStore<TUser>>().Object; 
     var options = new Mock<IOptions<IdentityOptions>>(); 
     var idOptions = new IdentityOptions(); 
     idOptions.Lockout.AllowedForNewUsers = false; 
     options.Setup(o => o.Value).Returns(idOptions); 
     var userValidators = new List<IUserValidator<TUser>>(); 
     var validator = new Mock<IUserValidator<TUser>>(); 
     userValidators.Add(validator.Object); 
     var pwdValidators = new List<PasswordValidator<TUser>>(); 
     pwdValidators.Add(new PasswordValidator<TUser>()); 
     var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(), 
      userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), 
      new IdentityErrorDescriber(), null, 
      new Mock<ILogger<UserManager<TUser>>>().Object, 
      null); 
     validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>())) 
      .Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); 
     return userManager; 
    } 

им использовать его с помощью этого метода:

 private UserController BuildCoontrollerWithDatabase() 
    { 
     DbContextOptionsBuilder dbContextOptionsBuilder = new DbContextOptionsBuilder(); 
     dbContextOptionsBuilder.UseInMemoryDatabase(); 

     ApplicationDbContext applicationDbContext = new ApplicationDbContext(dbContextOptionsBuilder.Options); 

     var userStore = new UserStore<ApplicationUser>(applicationDbContext); 

     UserManager<ApplicationUser> userManager = TestUserManager<ApplicationUser>(userStore); 

     return new UserController(userManager); 


    } 
Смежные вопросы