Тестирование аккаунта / вход в систему - PullRequest
0 голосов
/ 12 марта 2012

Я тестирую действие Account / Loggon, используя встроенный инструмент тестирования Visual Studio 2010 и библиотеку классов из этой статьи , чтобы создать поддельный контекст контроллера.Когда я запускаю метод теста, эта строка кода:

  FormsAuthentication.SetAuthCookie(username, false);    

выдает исключение: Ссылка на объект не установлена ​​на экземпляр объекта

Для проверки входа в системуДействие, я думаю, что я должен создать контроллер с поддельным контекстом контроллера, который имеет коллекцию cookie.Вот мой блок кода тестирования:

   AccountController controller = new AccountController();
   var cookies = new HttpCookieCollection();

   controller.ControllerContext = new FakeControllerContext(controller, cookies);

   ActionResult result = controller.RemoteLogOn(username, password);

1 Ответ

9 голосов
/ 12 марта 2012

Я не уверен, что это правильный способ, но это то, что мы делаем, и это работает.

Вместо непосредственного использования FormsAuthentication.SetAuthCookie, абстрагируйте его винтерфейс, например, IFormsAuthenticationService, и реализуйте как обычно.

Примите это в ваших контроллерах MVC, где это необходимо, например:

public AccountController(IFormsAuthenticationService formsAuthenticationService)
{
   _formsAuthenticationService = formsAuthenticationService; // should use DI here
}

public ActionResult LogOn(string username, string pw)
{
   if (yourLogicWhichChecksPw)
       _formsAuthenticationService.SetAuthCookie(username, false);
   return RedirectToAction("Index");
}

Затем в модульном тесте используйте что-то вроде Moq для подделки интерфейса.

var username = "blah";
var pw = "blah";
var fakesFormsAuth = new Mock<IFormsAuthenticationService>();
fakeFormsAuth.Verify(x => x.SetAuthCookie(username, false), Times.AtLeastOnce());                 
var controller = new AccountController(fakedFormsAuth.Object);
controller.LogOn(username, pw);

Причина для насмешки в этом заключается в том, что абсолютно не требуется модульное тестирование проверки подлинности с помощью форм.Это встроенная, хорошо протестированная и стабильная часть платформы ASP.NET.Вот почему мы высмеиваем вещи, в которых нас не волнует базовая реализация, вместо этого мы проверяем только то, что были выполнены определенные условия (оно вызывалось, генерировалось исключение, была установлена ​​некоторая переменная и т. Д.).

Проверьте вашесобственный код, а не механика .NET.

Что касается статьи Стивена Вальтера, это больше для фальсификации RequestContext, когда определенный код, который вы тестируете, ожидает данные в Запросе.Например, User.Identity, Request.IsAuthenticated, переменные формы и т. Д. Вот где вам нужно подделать контекст, например, следующий код:

public ActionResult Save(SomeModel)
{
   var user = Request.User.Identity; // this will be null, unless you fake the context.
}
...