2013-04-11 7 views
3

Я пытаюсь создать несколько простых модульных тестов для своих контроллеров, и я столкнулся с проблемой.Mocking поставщик WebSecurity

Я использую новый поставщик членства в 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); 
    } 

Благодаря

ответ

4

Возможное решение создать класс-оболочку вокруг WebSecurity - скажем WebSecurityWrapper. Выставлять статические методы WebSecurity, такие как WebSecurity.CurrentUserId как методы экземпляра на обертке. Работа обертки в этом случае будет просто делегировать все вызовы на WebSecurity.

Inject WebSecurityWrapper в конструктор GroupController. Теперь вы можете заглушить оболочку, используя насмешливую структуру по вашему выбору, и, таким образом, проверить логику контроллера.

Надеюсь, это поможет.

+1

Я использовал то, что вы сказали, но взял его дальше и связал все это. Спасибо за помощь –

Смежные вопросы