Проблема с модульным тестом mvc asp.net - PullRequest
1 голос
/ 04 октября 2011

Здесь, в контроллере

var roles = Roles.GetAllRoles(); 

не удалось выполнить тестовый вызов модуля а в

LogOnTest()(Error message is "The Role Manager feature has not been enabled.")

Не могли бы вы сказать мне, правильна ли моя тестовая функция или нужен какой-либо еще логический / функциональный тест?

[TestMethod]
public void LogOnTest()
{
    var target = new AccountController();
    var membershipMock = MockRepository.GenerateMock<AccountMembershipService>();
    var formsMock = MockRepository.GenerateMock<IFormsAuthenticationService>();

    target.FormsService = formsMock;
    target.MembershipService = membershipMock;

    var model = new LogonModel() { USERNAME= "aa", Password = "aa"};
    string returnUrl = null;
    bool isLoginSuccess = true;
    var actual = target.LogOnFromUser(model);
    if (actual == null)
        Assert.Fail("should have redirected");
 }

Контроллер:

public ActionResult LogOn(LogonModel model)
        {
if(MembershipService.ValidateUser(model.UsernName, model.Password))
                {
                    FormsService.SignIn(model.UsernName, true);
                                        var roles = Roles.GetAllRoles(); //Roles got failed here
return RedirectToAction("Index", "Event");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");

            return View("LogOn", model);
}

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Теоретически, я предпочитаю подход @ Сэма, но я все еще работаю над тем, чтобы он соответствовал моему внедрению зависимости. Я действительно хочу иметь возможность смоделировать свои собственные данные и получить полный контроль над своими тестами.

Однако в качестве пробела я нашел здесь следующее предложение: http://blog.gfader.com/2009/11/aspnet-how-to-show-all-roles-of-current.html

Исходя из этого, я только что добавил приведенный ниже код в файл App.config, и я смог продолжить тестирование.

 <system.web>
      <roleManager enabled="true"
             defaultProvider="AspNetWindowsTokenRoleProvider" />
    </system.web>
1 голос
/ 04 октября 2011

Вам нужно создать обертку вокруг статического класса Roles, чтобы вы могли внедрить фиктивную реализацию, которой вы управляете.В основном это, вероятно, будет похоже на ваши MembershipService и FormsService (вероятно, назовите его IRoleService) и будет нуждаться в методе GetAllRoles().

Вы можете создать реализацию по умолчанию (которая будет просто делегировать текущему статическому классу) в конструкторе null arg для вашего контроллера (что, как я думаю, происходит с вашими членством и службами форм), и предоставить свойство дляпозволяют вам переопределить его таким же образом, как и другие.

Другой вариант - расширить службу членства, чтобы позволить вам вызывать этот метод, а не создавать другую службу специально для ролей.Принцип ответственности, поэтому это не обязательно хорошая идея, но это означает, что вам не нужно вводить другую зависимость, и можно утверждать, что получение ролей члена входит в сферу обслуживания участников.

Если честно, я думаю, что вам лучше изменить свой элемент управления, чтобы иметь конструктор, который явно запрашивает реализации службы членства, службы форм и службы ролей и предоставляет имитации в тестах.зависимости контроллера есть.Затем вам нужно будет перейти к новому способу создания контроллера, так как по умолчанию их можно создавать, только если они имеют конструкторы по умолчанию.У вас есть несколько вариантов здесь.Либо сохраняйте выбранный вами вариант и используйте значения по умолчанию, либо используйте собственный ControllerFactory.Некоторые подробности здесь .Я предпочитаю подход ControllerFactory лично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...