Как я могу unit test мой 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 можно легко высмеять в unit test и убедиться, что контроллер вызывает на нем ожидаемые методы. Я бы не стал unit test классом FormsAuthWrapper, потому что он просто делегирует вызов FormsAuthentication, который выполняет то, что он должен делать (гарантия Microsoft: -)).