模拟WebSecurity提供程序

时间:2013-04-11 10:35:12

标签: asp.net-mvc-4 nunit rhino-mocks

我正在尝试为我的控制器创建一些简单的单元测试,但我遇到了一个问题。

我在MVC 4中使用新的成员资格提供程序并获取WebSecurity.CurrentUserId并将该值存储在数据库中。

当我针对此运​​行单元测试时,它失败了,我想我已经追溯到WebSecurity根本没有被嘲笑的事实。

这是我的代码,如果它有帮助的话,

控制器

    [HttpPost]
    public ActionResult Create(CreateOrganisationViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            Group group = _groupService.Create(
                new Group
                {
                    Name = viewModel.Name,
                    Slug = viewModel.Name.ToSlug(),
                    Profile = new Profile
                    {
                        Country = viewModel.SelectedCountry,
                        Description = viewModel.Description
                    },
                    CreatedById = WebSecurity.CurrentUserId,
                    WhenCreated = DateTime.UtcNow,
                    Administrators = new List<User> {_userService.SelectById(WebSecurity.CurrentUserId)}
                });
            RedirectToAction("Index", new {id = group.Slug});
        }
        return View(viewModel);
    }

测试

    [Test]
    public void SuccessfulCreatePost()
    {
        CreateOrganisationViewModel createOrganisationViewModel = new CreateOrganisationViewModel
        {
            Description = "My Group, bla bla bla",
            Name = "My Group",
            SelectedCountry = "gb"
        };

        IUserService userService = MockRepository.GenerateMock<IUserService>();
        IGroupService groupService = MockRepository.GenerateMock<IGroupService>();
        groupService.Stub(gS => gS.Create(null)).Return(new Group {Id = 1});
        GroupController controller = new GroupController(groupService, userService);
        RedirectResult result = controller.Create(createOrganisationViewModel) as RedirectResult;
        Assert.AreEqual("Index/my-group", result.Url);
    }

由于

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案是围绕WebSecurity创建一个包装类 - 比如WebSecurityWrapper。在包装器上公开静态WebSecurity方法(如WebSecurity.CurrentUserId)作为实例方法。在这种情况下,包装器的工作就是将所有调用委托给WebSecurity

WebSecurityWrapper注入GroupController的构造函数中。现在,您可以使用您选择的模拟框架来存储包装器 - 从而测试控制器逻辑。

希望这有帮助。

相关问题