2015-06-02 3 views
2

У меня есть код ниже и вы хотите протестировать сценарий, когда FormsAuthentication возвращает значение null. Как я могу это сделать, используя насмешку, я предполагаю, так как FormsAuthentication является закрытым классом со статическими методами. Я использую RhinoMocks.Mocking FormsAuthentication in MVC

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; 
    } 
+0

Anant - хорошая статья об аутентификации форм, но ничего не добавляет, чтобы ответить на мой вопрос. Вы прочитали мой вопрос? –

+0

Вы можете поместить класс оболочки вокруг класса FormsAuthentication, чтобы его можно было высмеять. Если этот метод сломался в вашем приложении, вы сразу узнаете (как только вы входите в систему), так создается единичный тест, чтобы он того стоил? –

+0

Создание единичного теста - единственный способ, если вы делаете TDD, когда пишете тест сначала, а затем записываете код! –

ответ

0

Я не вижу никаких доказательств 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; 
     } 
    } 

}