Я пытаюсь изучить модульное тестирование. Я пытаюсь выполнить модульное тестирование некоторых материалов о членстве, которые я делаю в 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 {общедоступный 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.
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
[Тест] 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, и что другой код не будет выполняться, но похоже, что это не так, поэтому я не уверен, может ли это быть проблемой.
Спасибо