Я пытаюсь изучить модульное тестирование. Я пытаюсь выполнить тестирование некоторых элементов Memembership, которые я делаю в 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)
{
}
Я знаю, что это конструктор по умолчанию, но я не знаю, почему ": это (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 { общественного недействительным SetAuthCookie (строка имя_пользователь, BOOL createPersistentCookie) { FormsAuthentication.SetAuthCookie (Username, createPersistentCookie); } public void SignOut() { FormsAuthentication.SignOut(); }
}
Тогда, наконец, свойство
public IFormsAuthentication FormsAuth
{
get;
private set;
}
Где, как с членством они только
общественный статический MembershipProvider Provider { ПОЛУЧИТЬ; частный набор; }
Я не уверен, что что менять тоже. Как я тоже изменил бы эту линию?
FormsAuth = formsAuth ?? новый FormsAuthenticationWrapper();
Я также попытался добавить еще один метод в интерфейс FormsAuthentication и Wrapper.
общественного недействительный RedirectFromLoginPage (строка имя_пользователь, 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_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, и это не значит, что другой код не будет выполнен, но, похоже, это не так, поэтому я не уверен, что это может быть проблемой.
Thanks
Вы должны, вероятно, разделить свои вопросы в отдельных сообщениях. Вопросы 1 и 2 связаны друг с другом, и это может быть одна должность, но вопрос 3, скорее всего, будет сам по себе. –
Вопрос 3 - это более чем один вопрос действительно –