Asp.net mvc 4 模拟Web安全提供程序

Asp.net mvc 4 模拟Web安全提供程序,asp.net-mvc-4,nunit,rhino-mocks,Asp.net Mvc 4,Nunit,Rhino Mocks,我试图为我的控制器创建一些简单的单元测试,但我遇到了一个问题 我正在使用MVC4中新的成员资格提供程序,获取WebSecurity.CurrentUserId,并将该值存储在数据库中 当我针对它运行单元测试时,它失败了,我想我已经追踪到了WebSecurity根本没有被嘲笑的事实 这是我的代码如果有帮助的话 控制器 [HttpPost] public ActionResult Create(CreateOrganisationViewModel viewModel) {

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

我正在使用MVC4中新的成员资格提供程序,获取
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);
    }
[HttpPost]
公共操作结果创建(CreateOrganizationViewModel viewModel)
{
if(ModelState.IsValid)
{
Group Group=\u groupService.Create(
新组
{
Name=viewModel.Name,
Slug=viewModel.Name.ToSlug(),
配置文件=新配置文件
{
Country=viewModel.SelectedCountry,
Description=viewModel.Description
},
CreatedById=WebSecurity.CurrentUserId,
WhenCreated=DateTime.UtcNow,
Administrators=新列表{{u userService.SelectById(WebSecurity.CurrentUserId)}
});
RedirectToAction(“Index”,new{id=group.Slug});
}
返回视图(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);
    }
[测试]
public void SuccessfulCreatePost()
{
CreateOrganizationViewModel CreateOrganizationViewModel=新建CreateOrganizationViewModel
{
Description=“我的团队,bla bla bla”,
Name=“我的团队”,
SelectedCountry=“gb”
};
IUserService userService=MockRepository.GenerateMock();
IGroupService groupService=MockRepository.GenerateMock();
groupService.Stub(gS=>gS.Create(null)).Return(新组{Id=1});
GroupController=新的GroupController(groupService,userService);
RedirectResult=控制器。创建(CreateOrganizationViewModel)作为RedirectResult;
AreEqual(“Index/my group”,result.Url);
}

谢谢

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

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


希望这能有所帮助。

我用了你说的话,但把它放得更远,并把所有内容都结合起来。谢谢你的帮助