【问题标题】:Unit test controller - membership error单元测试控制器 - 成员错误
【发布时间】:2011-11-29 04:48:26
【问题描述】:

我想为以下控制器创建单元测试,但在 Membership 类中失败:

公共类 AccountController:BaseController { 公共 IFormsAuthenticationService FormsService { 获取;放; } 公共 IMembershipService MembershipService { get;放; } 受保护的覆盖无效初始化(RequestContext requestContext) { if(FormsService == null) { FormsService = new FormsAuthenticationService(); } if(MembershipService == null) { MembershipService = new AccountMembershipService(); } base.Initialize(requestContext); } 公共 ActionResult LogOn() { 返回视图(“登录”); } [HttpPost] public ActionResult LogOnFromUser(LappLogonModel 模型,字符串 returnUrl) { 如果(模型状态。IsValid) { 字符串用户名 = Membership.GetUserNameByEmail(model.Email); if(MembershipService.ValidateUser(model.Email, model.Password)) { FormsService.SignIn(用户名,真); var service = new AuthenticateServicePack(); service.Authenticate(model.Email, model.Password); return RedirectToAction("Home"); } } ModelState.AddModelError("", "提供的用户名或密码不正确。"); 返回视图(“登录”,模型); } }

单元测试代码:

[测试类] 公共类 AccountControllerTest { [测试方法] 公共无效LogOnPostTest() { var mockRequest = MockRepository.GenerateMock(); var target = new AccountController_Accessor(); 目标。初始化(模拟请求); var model = new LogonModel() { UserName = "test", Password = "1234" }; 字符串 returnUrl = string.Empty; ActionResult 预期 = null; ActionResult 实际 = target.LogOn(model, returnUrl); 如果(实际 == 空) Assert.Fail("应该已经重定向"); } }

当我用谷歌搜索时,我得到了以下代码,但我不知道如何将成员资格传递给 accountcontroller

var httpContext = MockRepository.GenerateMock(); var httpRequest = MockRepository.GenerateMock(); httpContext.Stub(x => x.Request).Return(httpRequest); httpRequest.Stub(x => x.HttpMethod).Return("POST"); //创建一个模拟 MembershipProvider 并设置期望 var membersProvider = MockRepository.GenerateMock(); membersProvider.Expect(x => x.ValidateUser(username, password)).Return(false); //创建一个存根 IFormsAuthentication var formsAuth = MockRepository.GenerateStub(); /*但是在这里做什么???{...... ………………………………………………………………………………………………………………………………………… ................................................}*/ controller.LogOnFromUser(model, returnUrl);

请帮助我让这段代码正常工作。

【问题讨论】:

    标签: asp.net asp.net-mvc unit-testing


    【解决方案1】:

    看起来好像您正在使用 IMembershipServive 和 IFormsAuthenticationService 的具体实例,因为您正在使用访问器来初始化它们。当您使用具体类时,您并没有真正孤立地测试这个类,这解释了您所看到的问题。

    您真正想做的是测试控制器的逻辑,而不是其他服务的功能。

    幸运的是,这很容易解决,因为 MembershipService 和 FormsService 是控制器的公共成员,可以用模拟实现替换。

    // moq syntax:
    var membershipMock = new Mock<IMembershipService>();
    var formsMock = new Mock<IFormsAuthenticationService>();
    
    target.FormsService = formsMock.Object;
    target.MembershipService = membershipService.Object;
    

    现在您可以为您的控制器测试几个场景:

    • MembershipService 找不到用户时会发生什么?
    • 密码无效?
    • 用户和密码是否有效?

    请注意,如果 AuthenticationServicePack 有其他服务或依赖项,它也会导致问题。您可能需要考虑将其移动到控制器的属性中,或者如果每次身份验证需要单个实例,请考虑使用工厂或其他服务来封装此逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2017-06-26
      • 2011-12-01
      • 2014-01-16
      相关资源
      最近更新 更多