问题描述
我试图创建我的控制器一些简单的单元测试和我遇到的问题。
I'm trying to create some simple unit tests for my controllers and I've come across an issue.
我使用MVC中4新成员提供和获取 WebSecurity.CurrentUserId
,并在数据库中存储的值。
I'm using the new membership provider in MVC 4 and getting the WebSecurity.CurrentUserId
and storing that value in the database.
当我运行我的单元测试,对于这一点的失败,我想我已经跟踪这回事实,即 WebSecurity
并不是在所有的嘲笑。
When I run my unit tests against this it's failing and I think I have track this back to the fact that the WebSecurity
isn't being mocked at all.
下面是我的code。如果它有助于在所有,
Here's my code if it helps at all,
控制器
[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
作为包装实例方法。该包装在这种情况下,工作会简单地委托所有 WebSecurity
呼叫。
A possible solution is to create a wrapper class around WebSecurity - say WebSecurityWrapper
. Expose the static WebSecurity methods such as WebSecurity.CurrentUserId
as instance methods on the wrapper. The wrapper's job in this case would be simply to delegate all the calls to WebSecurity
.
注入 WebSecurityWrapper
到 GroupController
的构造。现在,您可以使用您所选择的模拟框架存根包装 - 从而测试控制器逻辑
Inject WebSecurityWrapper
into the GroupController
's constructor. Now, you can stub the wrapper using the mocking framework of your choice - and thus test the controller logic.
希望这有助于。
这篇关于惩戒WebSecurity提供商的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!