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