我正在嘗試學習單元測試。我正在嘗試單元測試我在asp.net mvc 1.0中製作的一些Memembership內容。我一直在關注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模型框架來讓生活更輕鬆。
現在我的問題是他們不使用「FormsAuthentication」上的moq。相反,他們將界面
public interface IFormsAuthentication
{
void SetAuthCookie(string userName, bool createPersistentCookie);
void SignOut();
}
然後進行包裝
公共類FormsAuthenticationWrapper:IFormsAuthentication { 公共無效SetAuthCookie(用戶名字符串,布爾createPersistentCookie) { FormsAuthentication.SetAuthCookie(用戶名,createPersistentCookie); } public void SignOut() { FormsAuthentication.SignOut(); }
}
然後最後一個屬性
public IFormsAuthentication FormsAuth
{
get;
private set;
}
凡與會員他們只有
公共靜態的MembershipProvider提供商 { 搞定; 私人設置; }
我不知道該怎麼改變東西。就像我會改變這條線一樣?
FormsAuth = formsAuth ?? ??新的FormsAuthenticationWrapper();
我也嘗試添加另一種方法到FormsAuthentication接口和包裝。
公共無效RedirectFromLoginPage(用戶名字符串,布爾createPersistentCookie) { FormsAuthentication.RedirectFromLoginPage(用戶名,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語句,它不會執行其他代碼,但htis似乎不是這種情況,所以我不確定這是否會成爲問題。
謝謝
你應該把你的問題分成不同的帖子。問題1和問題2是相關的,可能是一個職位,但問題3應該是最有可能的。 – 2009-06-22 12:57:25
問題3比一個更多的問題真的 – 2009-06-22 12:59:52