Как я могу выполнить модульное тестирование моего контроллера ASP.NET MVC, который использует FormsAuthentication?

Я работаю с решением ASP.NET MVC в тестовом режиме и хочу зарегистрировать пользователя в моем приложении, используя проверку подлинности с помощью форм. Код, который я хотел бы добавить в контроллер, выглядит примерно так:

FormsAuthentication.SetAuthCookie(userName, false);

Мой вопрос: как мне написать тест, чтобы оправдать этот код?

Есть ли способ проверить, что метод SetAuthCookie был вызван с правильными параметрами?

Есть ли способ ввести поддельную / поддельную FormsAuthentication?

1 ОТВЕТ
РЕШЕНИЕ

Я бы начал с написания интерфейса и класса-оболочки, который будет инкапсулировать эту логику, а затем использовал бы интерфейс в моем контроллере:

public interface IAuth 
{
    void DoAuth(string userName, bool remember);
}

public class FormsAuthWrapper : IAuth 
{
    public void DoAuth(string userName, bool remember) 
    {
        FormsAuthentication.SetAuthCookie(userName, remember);
    }
}

public class MyController : Controller 
{
    private readonly IAuth _auth;

    public MyController(IAuth auth) 
    {
        _auth = auth;
    }

}

Теперь IAuthможно легко смоделировать в модульном тесте и убедиться, что контроллер вызывает на нем ожидаемые методы. Я НЕ стал бы модульно тестировать FormsAuthWrapperкласс, потому что он просто делегирует вызов тому, FormsAuthenticationкоторый делает то, что должен делать (гарантия Microsoft :-)).

68
6.01.2016 10:31:06
+1 на этом, не проверяйте фреймворки других людей, только ВАШЕ использование ИХ. Мы делаем то же самое (подобное) в нашем приложении (оборачиваем FormsAuth и т. Д.)
chadmyers 14.12.2008 16:16:45
вздох Microsoft так гордится тем, что этот фреймворк ТАК проверяем! Я надеялся, что есть какой-то способ, чтобы издеваться над этим без обертывания. Не угадайте :(
maz 14.12.2008 19:39:34
Проблема не в том, что инфраструктура не тестируема ... проблема в том, что класс FormsAuthentication предшествует модульному тестированию MVC. Как отметил Дарин, лучший способ решить эту проблему - отделить контроллер от класса статическими методами с помощью интерфейса.
Jesse 28.01.2012 21:25:48
Не могли бы вы привести пример того, как вы будете издеваться над IAuth Darin?
DevDave 24.02.2012 11:55:50
@Tyler, ваш AccountController должен взять IAuthинтерфейс в своем конструкторе и больше не использовать в нем FormsAuthentication.
Darin Dimitrov 24.02.2012 12:11:45