gpt4 book ai didi

asp.net-mvc-4 - 模拟 WebSecurity 提供者

转载 作者:行者123 更新时间:2023-12-01 06:11:29 25 4
gpt4 key购买 nike

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

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

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

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

Controller

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

谢谢

最佳答案

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

WebSecurityWrapper 注入(inject)到 GroupController 的构造函数中。现在,您可以使用您选择的模拟框架对包装器进行 stub - 从而测试 Controller 逻辑。

希望这对您有所帮助。

关于asp.net-mvc-4 - 模拟 WebSecurity 提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15946579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com