首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟WebSecurity提供程序

模拟WebSecurity提供程序
EN

Stack Overflow用户
提问于 2013-04-11 18:35:12
回答 1查看 1.2K关注 0票数 3

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

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

当我针对这一点运行单元测试时,它失败了,我想我已经将其追溯到WebSecurity根本没有被模仿的事实。

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

控制器

代码语言:javascript
复制
    [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);
    }

测试

代码语言:javascript
复制
    [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);
    }

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-18 16:14:16

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

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

希望这能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15946579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档