为了跟踪目的,我必须记录用户所做方法的每次使用。我使用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在测试时忽略跟踪?
答案 0 :(得分: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();