Asp.net mvc 如何为窗体身份验证的帐户控制器编写测试

Asp.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()。即使在服务的模

试图找出如何充分测试我的帐户控制器。我在测试成功登录场景时遇到问题

问题1)我是否缺少任何其他测试。(我单独测试模型验证属性)

问题2)Put_ReturnsOverServiceWreDirector路由结果LogonSuccessandNoreturnUrlGiven()和Put_ReturnsDirectResultLogonSuccessandReturnUrlGiven()测试未通过。我已经把范围缩小到我要呼叫的电话线_membership.validateuser()。即使在服务的模拟设置期间,我声明无论何时调用validateuser,我都希望返回true,但方法调用返回false

这是我到目前为止得到的

AccountController.cs

[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”]);
}