public void Pass_Remind_To_Correct_Email_With_Valid_Captcha() { // Arrange PassReminderViewModel model = new PassReminderViewModel { Email = "correct", Captcha = "correct" }; Mock <IAuthProvider> mock = new Mock <IAuthProvider>(); mock.Setup(m => m.IsEmailExists(It.Is <string>(s => s == model.Email))) .Returns(true); AccountController target = new AccountController(mock.Object); SessionStorage storage = SessionStorage.Current; storage.CaptchaCode = model.Captcha; // Act ActionResult result = target.PassReminder(model, "#true", storage); // Assert Assert.IsInstanceOfType(result, typeof(RedirectResult)); mock.Verify(m => m.IsEmailExists(It.IsAny <string>()), Times.Once()); mock.Verify(m => m.RemindPass(It.IsAny <string>(), It.IsAny <string>()), Times.Once()); // тест может не проходить на слабых процессорах, изза фонового потока в контролллере Assert.IsTrue(storage.UnsucLoginAttempts == 0); }
public ActionResult PassReminder(PassReminderViewModel model, string returnUrl, SessionStorage storage) { ValidateCaptcha(model.Captcha, storage.CaptchaCode); if (ModelState.IsValid) { if (authProvider.IsEmailExists(model.Email)) { storage.UnsucLoginAttempts = 0; storage.CaptchaCode = null; Task.Factory.StartNew(() => { // Блокируем общий для главного и фонового потока ресурс // deadlock не ожидается, потому как пока это единственный монитор // + выполниться этот процесс должен оч. быстро. lock (BlogSettings.Current) { string url = ""; if (Request != null) // при юнит-тестировании пропускаем этот блок { url = Request.Url.Authority + Url.Action("ConfirmNewPass"); } authProvider.RemindPass(model.Email, url); } }); // Перенаправляем пользователя с сообщением об отправлении письма (almost POST/Redirect/GET pattern) // и продолжим обработку запроса (отправку письма) в отдельном потоке (чуть выше) string redirectUrl = "mock"; if (Url != null) // т.к. объект Url == null при юнит-тестировании { redirectUrl = Url.Action("PassReminder", new { email = model.Email, returnUrl = returnUrl }); } TempData["msgSended"] = true; return(Redirect(redirectUrl)); } else { storage.UnsucLoginAttempts++; ModelState.AddModelError("email", "Указанный email-адрес не зарегистрирован"); return(View(model)); } } else { storage.UnsucLoginAttempts++; return(View(model)); } }
public void Dont_Pass_Remind_To_Invalid_Email() { // Arrange PassReminderViewModel model = new PassReminderViewModel { Email = "invalid", }; IAuthProvider authProv = new FormsAuthProvider("", "", "correct"); AccountController target = new AccountController(authProv); // Act ActionResult result = target.PassReminder(model, "#true", SessionStorage.Current); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); }
public void Dont_Pass_Remind_To_Correct_Email_With_Invalid_Captcha_3() { // Arrange PassReminderViewModel model = new PassReminderViewModel { Email = "correct" }; IAuthProvider authProv = new FormsAuthProvider("", "", model.Email); AccountController target = new AccountController(authProv); SessionStorage storage = SessionStorage.Current; storage.CaptchaCode = "correct"; // Act ActionResult result = target.PassReminder(model, "#true", storage); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); Assert.IsTrue(storage.UnsucLoginAttempts == 1); }