运行测试

时间:2016-05-10 06:31:50

标签: c# asp.net-mvc moq xunit system.diagnostics

为了跟踪目的,我必须记录用户所做方法的每次使用。我使用System.Diagnostics.Trace来填充此目的,但是在对这些方法运行测试时我遇到了问题。

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

这个小代码在我的应用程序上运行良好,但在测试时,它不再起作用(由于HttpContext.Current.Userundefined)。

我怎样才能模拟这个或者告诉我的xUnit在测试时忽略跟踪?

1 个答案:

答案 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();