我正在尝试为我的控制器创建一些简单的单元测试,但我遇到了一个问题。
我在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);
}
由于
答案 0 :(得分:4)
一种可能的解决方案是围绕WebSecurity创建一个包装类 - 比如WebSecurityWrapper
。在包装器上公开静态WebSecurity方法(如WebSecurity.CurrentUserId
)作为实例方法。在这种情况下,包装器的工作就是将所有调用委托给WebSecurity
。
将WebSecurityWrapper
注入GroupController
的构造函数中。现在,您可以使用您选择的模拟框架来存储包装器 - 从而测试控制器逻辑。
希望这有帮助。