Я пытаюсь научиться юнит-тестированию. Я пытаюсь провести модульное тестирование некоторых вещей, которые я создаю в asp.net mvc 1.0. Я следил за книгой о MVC, и меня смущают некоторые вещи, которые, надеюсь, кто-то сможет прояснить для меня.
Я использую Nunit и Moq для своих фреймворков.
Вопрос 1:
public AuthenticationController(IFormsAuthentication formsAuth, MembershipProvider provider)
{
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Provider = provider ?? Membership.Provider;
}
Я немного растерялся, что "??" я никогда не видел это раньше. Как будто я даже не знаю, что на самом деле здесь происходит. Как они проходят в интерфейсе, а затем "??" пометка происходит и делает новый FormsAuthenticationWraper сделано?
Вопрос 2.
public AuthenticationController(): this(null, null)
{
}
Я знаю, что это конструктор по умолчанию, но я не уверен, почему ": this (null, null)" делает.
Например, что он реализует? и что это за реферинг тоже. И вдобавок ко всему, почему это не может быть просто пропущено? И просто вставьте конструктор по умолчанию, как есть.
Вопрос 3.
В книге (asp.net mvc 1.0 быстро) рассказывается о том, как много работы по реализации провайдера Memembership будет много. Поэтому они используют макет moq для облегчения жизни.
Теперь мой вопрос: они не используют moq в «FormsAuthentication». Вместо этого они создают интерфейс
public interface IFormsAuthentication
{
void SetAuthCookie(string userName, bool createPersistentCookie);
void SignOut();
}
Затем сделайте обертку
открытый класс FormsAuthenticationWrapper: IFormsAuthentication
{
public void SetAuthCookie (строка userName, bool createPersistentCookie)
{
FormsAuthentication.SetAuthCookie (userName, createPersistentCookie);
}
public void SignOut ()
{
FormsAuthentication.SignOut ();
}
}
Тогда наконец свойство
public IFormsAuthentication FormsAuth
{
get;
private set;
}
Где, как и в случае членства, они имеют только
публичный статический поставщик MembershipProvider
{
получить;
приватный набор;
}
Я не уверен, хотя, что изменить вещи тоже. Например, что бы я тоже изменил эту строку?
FormsAuth = formsAuth ?? новый FormsAuthenticationWrapper ();
Я также попытался добавить другой метод в интерфейс FormsAuthentication и Wrapper.
public void RedirectFromLoginPage (строка userName, bool createPersistentCookie)
{
FormsAuthentication.RedirectFromLoginPage (userName, createPersistentCookie);
}
Пока я не уверен, что происходит, но мой модульный тест всегда терпит неудачу, не имеет значения, что я пытаюсь сделать, чтобы это исправить.
public ActionResult Login(string returnUrl, FormCollection form, bool rememberMe)
{
LoginValidation loginValidation = new LoginValidation();
try
{
UpdateModel(loginValidation, form.ToValueProvider());
}
catch
{
return View("Login");
}
if (ModelState.IsValid == true)
{
bool valid = authenticate.VerifyUser(loginValidation.UserName, loginValidation.Password);
if (valid == false)
{
ModelState.AddModelError("frm_Login", "Either the Password or UserName is invalid");
}
else if (string.IsNullOrEmpty(returnUrl) == false)
{
/* if the user has been sent away from a page that requires them to login and they do
* login then redirect them back to this area*/
return Redirect(returnUrl);
}
else
{
FormsAuth.RedirectFromLoginPage(loginValidation.UserName, rememberMe);
}
}
return View("Login");
Here is my test
[Test]
public void Test_If_User_Is_Redirected_Back_To_Page_They_Came_From_After_Login ()
{
System.Diagnostics.Debugger.Break (); * * тысяча сорок семь
var formsAuthenticationMock = new Mock<AuthenticationController.IFormsAuthentication>();
var membershipMock = new Mock<MembershipProvider>();
membershipMock.Setup(m => m.ValidateUser("chobo2", "1234567")).Returns(true);
// Setup controller
AuthenticationController target = new AuthenticationController(formsAuthenticationMock.Object, membershipMock.Object);
// Execute
FormCollection form = new FormCollection();
form.Add("Username", "chobo2");
form.Add("password", "1234567");
ViewResult actual = target.Login(null, form, false) as ViewResult;
Assert.That(actual.View, Is.EqualTo("home"));
formsAuthenticationMock.Verify();
}
Фактическое всегда возвращается к нулю. Я пробовал ViewResult, RedirectResult и RedirectToRouteResult, но все возвращаются с нулевым значением. Поэтому я не уверен, почему это происходит, так как сначала я нахожу странным, что
FormsAuth.RedirectFromLoginPage(loginValidation.UserName, rememberMe);
Не останавливает просмотр и начинает перенаправлять. Сначала я подумал, что когда он попадает в эту строку, это похоже на оператор return, и это значит, что никакой другой код не будет выполнен, но, похоже, это не так, поэтому я не уверен, может ли это быть проблемой.
Спасибо