Я не вижу никаких доказательств FormsAuthentication.Decrypt() всегда возвращает нуль, кроме a bug described here. Вместо этого он выдает ArgumentException
, когда файл cookie недействителен. Я думаю, вы должны проверить, что куки не истекли, хотя ..
Но ради аргумента, это то, как вы TDD запечатанного класса:
Создать интерфейс для всех методов, которые необходимо
Это идет в свой рабочий код:
public interface IFormsAuthentication
{
FormsAuthenticationTicket Decrypt(string cookieValue);
}
Создать оболочку вокруг запечатанного класса
Это также входит в ваш рабочий код:
public class MyFormsAuthentication : IFormsAuthentication
{
public FormsAuthenticationTicket Decrypt(string cookieValue)
{
return FormsAuthentication.Decrypt(cookieValue);
}
}
Изменить метод, который вы хотите проверить
Он должен использовать IFormsAuthentication
объект он снабжен вместо герметичного класса. В производстве это должно быть вашей оберткой. Очевидно, что это в вашем рабочем коде ...
public class PaxiumPricipalCreator
{
IFormsAuthentication _formsAuthentication;
public PaxiumPricipalCreator(IFormsAuthentication formsAuthentication)
{
_formsAuthentication = formsAuthentication;
}
public PaxiumPrincipal CreatePrincipalFromCookie(string cookieValue)
{
var authTicket = _formsAuthentication.Decrypt(cookieValue);
if (authTicket == null)
{
return null;
};
var userPrincipal = new PaxiumPrincipal(new GenericIdentity(authTicket.Name), null);
return userPrincipal;
}
}
Создание модульного теста с макетом идентифицирующей (Этот пример в MSTest)
Это ваш код TEST:
[TestClass]
public class PaxiumPricipalCreatorTests
{
[TestMethod]
public void Returns_NULL_principal_when_IFormsAuthentication_returns_null()
{
var mockAuthenticator = new NullReturningFormsAuthentication();
var principalCreator = new PaxiumPricipalCreator(mockAuthenticator);
var actual = principalCreator.CreatePrincipalFromCookie(string.Empty);
Assert.IsNull(actual);
}
public class NullReturningFormsAuthentication : IFormsAuthentication
{
public FormsAuthenticationTicket Decrypt(string cookieValue)
{
return null;
}
}
}
Anant - хорошая статья об аутентификации форм, но ничего не добавляет, чтобы ответить на мой вопрос. Вы прочитали мой вопрос? –
Вы можете поместить класс оболочки вокруг класса FormsAuthentication, чтобы его можно было высмеять. Если этот метод сломался в вашем приложении, вы сразу узнаете (как только вы входите в систему), так создается единичный тест, чтобы он того стоил? –
Создание единичного теста - единственный способ, если вы делаете TDD, когда пишете тест сначала, а затем записываете код! –