Asp.net mvc 如何为窗体身份验证的帐户控制器编写测试
试图找出如何充分测试我的帐户控制器。我在测试成功登录场景时遇到问题 问题1)我是否缺少任何其他测试。(我单独测试模型验证属性) 问题2)Put_ReturnsOverServiceWreDirector路由结果LogonSuccessandNoreturnUrlGiven()和Put_ReturnsDirectResultLogonSuccessandReturnUrlGiven()测试未通过。我已经把范围缩小到我要呼叫的电话线_membership.validateuser()。即使在服务的模拟设置期间,我声明无论何时调用validateuser,我都希望返回true,但方法调用返回false 这是我到目前为止得到的 AccountController.csAsp.net mvc 如何为窗体身份验证的帐户控制器编写测试,asp.net-mvc,unit-testing,asp.net-membership,rhino-mocks,xunit.net,Asp.net Mvc,Unit Testing,Asp.net Membership,Rhino Mocks,Xunit.net,试图找出如何充分测试我的帐户控制器。我在测试成功登录场景时遇到问题 问题1)我是否缺少任何其他测试。(我单独测试模型验证属性) 问题2)Put_ReturnsOverServiceWreDirector路由结果LogonSuccessandNoreturnUrlGiven()和Put_ReturnsDirectResultLogonSuccessandReturnUrlGiven()测试未通过。我已经把范围缩小到我要呼叫的电话线_membership.validateuser()。即使在服务的模
[HandleError]
public class AccountController : Controller
{
private IMembershipService _membershipService;
public AccountController()
: this(null)
{
}
public AccountController(IMembershipService membershipService)
{
_membershipService = membershipService ?? new AccountMembershipService();
}
[HttpGet]
public ActionResult LogOn()
{
return View();
}
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (_membershipService.ValidateUser(model.UserName,model.Password))
{
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Overview");
}
ModelState.AddModelError("*", "The user name or password provided is incorrect.");
}
return View(model);
}
}
AccountServices.cs
public interface IMembershipService
{
bool ValidateUser(string userName, string password);
}
public class AccountMembershipService : IMembershipService
{
public bool ValidateUser(string userName, string password)
{
throw new System.NotImplementedException();
}
}
AccountControllerFacts.cs
public class AccountControllerFacts
{
public static AccountController GetAccountControllerForLogonSuccess()
{
var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>();
var controller = new AccountController(membershipServiceStub);
membershipServiceStub
.Stub(x => x.ValidateUser("someuser", "somepass"))
.Return(true);
return controller;
}
public static AccountController GetAccountControllerForLogonFailure()
{
var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>();
var controller = new AccountController(membershipServiceStub);
membershipServiceStub
.Stub(x => x.ValidateUser("someuser", "somepass"))
.Return(false);
return controller;
}
public class LogOn
{
[Fact]
public void Get_ReturnsViewResultWithDefaultViewName()
{
// Arrange
var controller = GetAccountControllerForLogonSuccess();
// Act
var result = controller.LogOn();
// Assert
Assert.IsType<ViewResult>(result);
Assert.Empty(((ViewResult)result).ViewName);
}
[Fact]
public void Put_ReturnsOverviewRedirectToRouteResultIfLogonSuccessAndNoReturnUrlGiven()
{
// Arrange
var controller = GetAccountControllerForLogonSuccess();
var user = new LogOnModel();
// Act
var result = controller.LogOn(user, null);
var redirectresult = (RedirectToRouteResult) result;
// Assert
Assert.IsType<RedirectToRouteResult>(result);
Assert.Equal("Overview", redirectresult.RouteValues["controller"]);
Assert.Equal("Index", redirectresult.RouteValues["action"]);
}
[Fact]
public void Put_ReturnsRedirectResultIfLogonSuccessAndReturnUrlGiven()
{
// Arrange
var controller = GetAccountControllerForLogonSuccess();
var user = new LogOnModel();
// Act
var result = controller.LogOn(user, "someurl");
var redirectResult = (RedirectResult) result;
// Assert
Assert.IsType<RedirectResult>(result);
Assert.Equal("someurl", redirectResult.Url);
}
[Fact]
public void Put_ReturnsViewIfInvalidModelState()
{
// Arrange
var controller = GetAccountControllerForLogonFailure();
var user = new LogOnModel();
controller.ModelState.AddModelError("*","Invalid model state.");
// Act
var result = controller.LogOn(user, "someurl");
var viewResult = (ViewResult) result;
// Assert
Assert.IsType<ViewResult>(result);
Assert.Empty(viewResult.ViewName);
Assert.Same(user,viewResult.ViewData.Model);
}
[Fact]
public void Put_ReturnsViewIfLogonFailed()
{
// Arrange
var controller = GetAccountControllerForLogonFailure();
var user = new LogOnModel();
// Act
var result = controller.LogOn(user, "someurl");
var viewResult = (ViewResult) result;
// Assert
Assert.IsType<ViewResult>(result);
Assert.Empty(viewResult.ViewName);
Assert.Same(user,viewResult.ViewData.Model);
Assert.Equal(false,viewResult.ViewData.ModelState.IsValid);
}
}
}
公共类AccountControllerFacts
{
公共静态AccountController GetAccountControllerForLogonSuccess()
{
var membershipServiceStub=MockRepository.GenerateStub();
var控制器=新的AccountController(membershipServiceStub);
会员服务存根
.Stub(x=>x.ValidateUser(“someuser”、“somepass”))
.返回(真);
返回控制器;
}
公共静态AccountController GetAccountControllerForLogonFailure()
{
var membershipServiceStub=MockRepository.GenerateStub();
var控制器=新的AccountController(membershipServiceStub);
会员服务存根
.Stub(x=>x.ValidateUser(“someuser”、“somepass”))
。报税表(虚假);
返回控制器;
}
公共类登录
{
[事实]
public void Get_ReturnsViewResultWithDefaultViewName()
{
//安排
var controller=GetAccountControllerForLogonSuccess();
//表演
var result=controller.LogOn();
//断言
Assert.IsType(结果);
Assert.Empty(((ViewResult)result.ViewName);
}
[事实]
public void Put_returnsOverServiceWreDirector路由结果LogonSuccessandNoreturnUrlGiven()
{
//安排
var controller=GetAccountControllerForLogonSuccess();
var user=new LogOnModel();
//表演
var result=controller.LogOn(用户,空);
var redirectresult=(RedirectToRouteResult)结果;
//断言
Assert.IsType(结果);
Assert.Equal(“Overview”,redirectresult.RouteValues[“controller”]);
Assert.Equal(“Index”,redirectresult.RouteValues[“action”]);
}
[事实]
public void Put_returnsDirectResultifLogonSuccessandReturnUrlGiven()
{
//安排
var controller=GetAccountControllerForLogonSuccess();
var user=new LogOnModel();
//表演
var result=controller.LogOn(用户“someurl”);
var redirectResult=(redirectResult)result;
//断言
Assert.IsType(结果);
相等(“someurl”,redirectResult.Url);
}
[事实]
public void Put_ReturnsViewIfInvalidModelState()
{
//安排
var controller=GetAccountControllerForLogonFailure();
var user=new LogOnModel();
controller.ModelState.AddModelError(“*”,“模型状态无效”);
//表演
var result=controller.LogOn(用户“someurl”);
var viewResult=(viewResult)result;
//断言
Assert.IsType(结果);
Assert.Empty(viewResult.ViewName);
Assert.Same(user、viewResult.ViewData.Model);
}
[事实]
公共无效Put_ReturnsViewIfLogonFailed()
{
//安排
var controller=GetAccountControllerForLogonFailure();
var user=new LogOnModel();
//表演
var result=controller.LogOn(用户“someurl”);
var viewResult=(viewResult)result;
//断言
Assert.IsType(结果);
Assert.Empty(viewResult.ViewName);
Assert.Same(user、viewResult.ViewData.Model);
Assert.Equal(false,viewResult.ViewData.ModelState.IsValid);
}
}
}
找到了修复测试的方法
[Fact]
public void Put_ReturnsRedirectToRouteResultForOverviewIfLogonSuccessAndNoReturnUrlGiven()
{
// Arrange
var mocks = new MockRepository();
var mockMembershipService = mocks.StrictMock<IMembershipService>();
using (mocks.Record())
{
Expect.Call(mockMembershipService.ValidateUser("", "")).IgnoreArguments().Return(true).Repeat.Any();
}
var controller = new AccountController(mockMembershipService);
var user = new LogOnModel();
// Act
ActionResult result;
using (mocks.Playback()){
result = controller.LogOn(user, null);
}
// Assert
Assert.IsType<RedirectToRouteResult>(result);
var redirectresult = (RedirectToRouteResult)result;
Assert.Equal("Overview", redirectresult.RouteValues["controller"]);
Assert.Equal("Index", redirectresult.RouteValues["action"]);
}
[事实]
public void Put_ReturnsDirectorOutResultForOverviewIfLogonSuccessandNoreturnUrlGiven()
{
//安排
var mocks=new MockRepository();
var mockMembershipService=mocks.StrictMock();
使用(mocks.Record())
{
Expect.Call(mockMembershipService.ValidateUser(“,”).IgnoreArguments().Return(true).Repeat.Any();
}
var控制器=新的AccountController(mockMembershipService);
var user=new LogOnModel();
//表演
行动结果;
使用(mocks.Playback()){
结果=controller.LogOn(用户,空);
}
//断言
Assert.IsType(结果);
var redirectresult=(RedirectToRouteResult)结果;
Assert.Equal(“Overview”,redirectresult.RouteValues[“controller”]);
Assert.Equal(“Index”,redirectresult.RouteValues[“action”]);
}