我努力学习单元测试。 我试图单元测试一些东西Memembership我在asp.net mvc的1.0决策。 我一直在关注一书中对MVC和我感到困惑的一些东西,希望有人能收拾我。
我使用NUnit和起订量为我的框架。
问题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提供商将是大量的工作。 于是,他们用起订量样机框架,使生活更轻松。
现在的问题是他们不使用的起订量的“FormsAuthentication”。 相反,他们将界面
public interface IFormsAuthentication
{
void SetAuthCookie(string userName, bool createPersistentCookie);
void SignOut();
}
然后进行包装
公共类FormsAuthenticationWrapper:IFormsAuthentication {公共无效SetAuthCookie(用户名字符串,布尔createPersistentCookie){FormsAuthentication.SetAuthCookie(用户名,createPersistentCookie); } public void SignOut() { FormsAuthentication.SignOut(); }公共无效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似乎并没有这样的情况,所以我不知道这可能是问题。
谢谢