2016-05-10 2 views
0

Для целей трассировки я должен регистрировать каждое использование метода, сделанного пользователем. Я использую System.Diagnostics.Trace, чтобы заполнить эту задачу, но при запуске теста над этим методом возникает проблема.Игнорировать сообщение о трассировке при запуске. Тест

Trace.TraceInformation($"L'utilisateur {HttpContext.Current.User.Identity.Name} a fait une recherche à partir de l'identifiant {ID} "); 

Этот небольшой код хорошо работает на моем приложении, но когда дело доходит до тестирования, он больше не работает (из-за HttpContext.Current.User быть undefined).

Как я могу издеваться над этим или просто сказать моему xUnit игнорировать трассировку во время тестирования?

ответ

1

Я бы порекомендовал вам скрыть вашу логику отслеживания за интерфейсом, который можно высмеять.

Например, вы можете объявить интерфейс, как показано ниже:

public interface ITraceWriter 
{ 
    void TraceInfo(string traceText); 
} 

Следующим шагом будет реализовывать этот интерфейс как поведение трассировки:

public class UserTraceWriter : ITraceWriter 
{ 
    public void TraceInfo(string traceText) 
    { 
     Trace.TraceInformation($"User {HttpContext.Current.User.Identity.Name} {traceText}"); 
    } 
} 

Вам нужно будет впрыскивать ITraceWriter в ваш класс, ответственный за выполнение действий пользователя, например:

public class UserDoSomethingClass 
{ 
    private readonly ITraceWriter writer; 

    public UserDoSomethingClass(ITraceWriter writer) 
    { 
     this.writer = writer; 
    } 

    public void DoSomething() 
    { 
     // the user did something. 

     this.writer.TraceInfo("did something"); 
    } 
} 

Наконец, это позволит вам безопасно протестировать класс:

var mockTraceWriter = new Mock<ITraceWriter>(); 

mockTraceWriter.Setup(w => w.TraceInfo(It.IsAny<string>())); 

var testClass = new UserDoSomethingClass(mockTraceWriter.Object); 

testClass.DoSomething(); 
Смежные вопросы