Ich versuche Unit-Tests zu lernen. Ich versuche, einige Membership Sachen zu testen, die ich in asp.net mvc 1.0 mache. Ich bin einem Buch über MVC gefolgt und ich bin verwirrt über einige Sachen, die hoffentlich jemand für mich aufräumen kann.Brauchen Sie Hilfe, diesen Code zu verstehen
Ich benutze Nunit und Moq für meine Frameworks.
Frage 1:
public AuthenticationController(IFormsAuthentication formsAuth, MembershipProvider provider)
{
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Provider = provider ?? Membership.Provider;
}
Ich bin ein bisschen verwirrt, was "??" habe ich es vorher nie wirklich gesehen. Ich weiß nicht einmal, was hier wirklich passiert. Wie sie die Schnittstelle übergeben und dann "??" Mark passiert und macht einen neuen FormsAuthenticationWraper?
Frage 2.
public AuthenticationController(): this(null, null)
{
}
Ich weiß, das der Standard-Konstruktor ist, aber ich bin nicht sicher, warum ": diese (null, null)" tut.
Wie funktioniert es? und was ist das auch? Und obendrüber warum kann das nicht einfach ausgelassen werden? Und kleben Sie einfach den Standardkonstruktor so wie er ist.
Frage 3.
Im Buch (asp.net Mvc 1.0 schnell) es spricht darüber, wie es ziemlich viel Arbeit zur Umsetzung der Memembership Anbieter eine Menge Arbeit wäre wäre. Daher verwenden sie das Moq-Mockup-Framework, um das Leben einfacher zu machen.
Jetzt ist meine Frage, sie verwenden nicht den Moq auf der "FormsAuthentication". Sie machen stattdessen eine Schnittstelle
public interface IFormsAuthentication
{
void SetAuthCookie(string userName, bool createPersistentCookie);
void SignOut();
}
Dann einen Wrapper machen
public class FormsAuthenticationWrapper: IFormsAuthentication { public void SetAuthCookie (string username, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie (USERNAME- createPersistentCookie); } public void SignOut() { FormsAuthentication.SignOut(); }
}
Dann endlich eine Eigenschaft
public IFormsAuthentication FormsAuth
{
get;
private set;
}
Wo, wie mit der Mitgliedschaft sie nur
public static MembershipProvider Provider { get haben; privates Set; }
Ich bin nicht sicher, obwohl, was die Sachen zu ändern. Wie würde ich diese Linie auch ändern?
FormsAuth = FormulareAuth ?? neu FormsAuthenticationWrapper();
Ich habe auch versucht, eine andere Methode in die FormsAuthentication Interface und Wrapper hinzuzufügen.
public void RedirectFromLoginPage (string username, bool createPersistentCookie) { FormsAuthentication.RedirectFromLoginPage (USERNAME- createPersistentCookie); }
Noch bin ich nicht sicher, was passiert, aber mein Komponententest schlägt immer fehl, egal was ich versuche, um es zu beheben.
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();
}
Tatsächlich kommt immer wieder auf null zurück. Ich habe versucht, ViewResult, RedirectResult und RedirectToRouteResult, aber jeder kommt zurück Null. So bin ich nicht sicher, warum dies geschieht, da ich es seltsam finden, dass erste
FormsAuth.RedirectFromLoginPage(loginValidation.UserName, rememberMe);
die Ansicht nicht stoppen und beginnt zu umleiten. Ich dachte zuerst, sobald es diese Zeile trifft, ist es wie eine Rückkehranweisung und das ist es wird kein anderer Code ausgeführt, aber es scheint nicht der Fall zu sein, also bin ich nicht sicher, ob dies das Problem sein könnte.
Danke
Sie sollten Ihre Fragen wahrscheinlich in separaten Beiträgen aufteilen. Frage 1 und 2 sind verwandt und könnten einen Beitrag darstellen, aber Frage 3 sollte höchstwahrscheinlich für sich allein stehen. –
Frage 3 ist mehr als eine Frage wirklich –