Я не уверен, что это правильный способ, но это то, что мы делаем, и это работает.
Вместо непосредственного использования 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.
}