Тестирование аккаунта / вход в систему
Я тестирую действие 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 ответ
Я не уверен, что это правильный путь, но это то, что мы делаем, и это работает.
Вместо непосредственного использования 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, переменные Form и т. Д. Вот где вам нужно подделать контекст, например, следующий код:
public ActionResult Save(SomeModel)
{
var user = Request.User.Identity; // this will be null, unless you fake the context.
}