2016-02-23 3 views
1

Я тестирую код, который требует входа пользователя в систему. Когда я пытаюсь войти в систему с AccountController, похоже, что все работает, но в AccountController(IPrincipal) User все еще null. Как я могу правильно войти (или, может быть, я как-то издеваюсь над ним)?Как я могу протестировать методы, которые должны быть зарегистрированы пользователем

public async Task SetupAsync() 
     { 
      var context = new DataContext(); 
      var manager = new UserManager(new UserStore(context)); 
      var accountController = new AccountController(manager); 
      var mockAuthenticationManager = new Mock<IAuthenticationManager>(); 
      mockAuthenticationManager.Setup(am => am.SignOut()); 
      mockAuthenticationManager.Setup(am => am.SignIn()); 
      accountController.AuthenticationManager = mockAuthenticationManager.Object; 
      var user = new LoginViewModel 
      { 
       Email = "[email protected]", 
       Password = "useruser", 
       RememberMe = false 
      }; 
      if (manager.FindByEmail("[email protected]") == null) 
      { 
       await manager.CreateAsync(new User { Email = "[email protected]", UserName = "[email protected]" }, "useruser"); 
      } 
      await accountController.Login(user, "home/index"); 
      _calendarController = new CalendarController(context); 
     } 

Здесь я получил Пользователь нулевого исключения:

public ClaimsPrincipal CurrentUser 
     { 
      get { return new ClaimsPrincipal((System.Security.Claims.ClaimsPrincipal)this.User); } 
     } 

Edit: На обратной линии, у меня есть еще User свойство нуля. Это пример из AccountController:

var user = await _userManager.FindAsync(model.Email, model.Password); 

      if (user != null) 
      { 
       await SignInAsync(user, model.RememberMe); 
       return RedirectToAction("index", "calendar"); 
      } 
+0

не могли бы вы дать код для источника? также, какое тестирование вы хотите сделать? модульное тестирование? –

+0

Да, это должно быть модульное тестирование. Теперь это беспорядок с некоторыми поведениями интеграционных тестов. В идеале я обволакивал, как фокусный контекст (я буду использовать среду Effor для этого) и протестировать интеграцию позже. –

+0

Также, может быть, я должен добавить: когда я использую веб-сайт вручную, все работает, Пользователь не имеет значения. –

ответ

0

Понял это самостоятельно, возможно, не изящное решение, но я все равно счастлив. @andreasnico ваш ответ помог, спасибо.

Я издеваюсь над своими обычными претензиями и настраиваю UserId - это то, что мне действительно нужно.

var mockCp = new Mock<IClaimsPrincipal>(); 
mockCp.SetupGet(cp => cp.UserId).Returns(user.Id); 
_calendarController.CurrentUser = mockCp.Object; 
1

Вы должны издеваться свой _userManager и использовать макет установки для случаев, когда метод FindAsync называется. Затем вы возвращаете поддельного пользователя, который вы можете использовать позже в коде.

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