在 MS 单元测试 (.NET Core) 中设置 System.Diagnostics.Activity.Current

Set System.Diagnostics.Activity.Current in MS Unit Tests (.NET Core)

我的网站 api 中有引用 System.Diagnostics.Activity.Current.Id 的域 类。一旦对象被序列化并存储在 Cosmos 中,它就会使用这个值作为相关 ID。调用 API 时获取此值没有问题。但是,如果我尝试在我的域单元测试中引用此值,则 System.Diagnostics.Activity.Current 为空。我已经尝试在我的单元测试函数中设置它,但它在我的域中仍然始终为 null。

System.Diagnostics.Activity.Current = new System.Diagnostics.Activity("MyUnitTests");

我知道 System.Diagnostics.Activity.Current 是由当前的 HttpContext 驱动的,但在我的域单元测试中也没有当前的 http 上下文。我怎样才能使它与我的单元测试一起工作?

示例: 域名Class

public class Company
{  
    public int CompanyId { get; private set; }        
    public string Name { get; private set; }
    public string CorrelationId { get { return System.Diagnostics.Activity.Current.Id; } }
}

单元测试

    [TestMethod]
    public void MyTest()
    {
        Company c = new Company();
        Assert.AreNotEqual(string.Empty, c.CorrelationId);
    }

此单元测试抛出空引用异常,因为 System.Diagnostics.Activity.Current 为空。

这是一个围绕混合关注点的设计问题,可能是代码异味。

当前代码与 运行 时间问题紧密相关,这些问题在单独进行单元测试时不存在。

您很可能需要 运行 集成测试,其中使用有效上下文发出实际请求。

通过服务抽象分配 id 将有助于放松与 运行 时间问题的耦合。

并且不需要对用于存储 运行 时间数据的简单域 POCO 进行单元测试。

我同意在域 class 中使用 System.Diagnostics.Activity 是一种代码味道。

但是我的单元测试也遇到了类似的问题。测试的业务逻辑代码使用 Activity.Current.AddBaggage:

Activity.Current.AddBaggage("CustomerRef","SomeCustomerReference");

因为只测试逻辑,不涉及HttpRequest,Activity.Current为NULL

所以我用以下基础 class 扩展了我的单元测试(示例是针对 XUnit 的):

public class BaseTest : IDisposable
{
    private Activity unitTestActivity;

    protected BaseTest()
    {
        unitTestActivity = new Activity("UnitTest").Start();

    }

    public void Dispose()
    {
        unitTestActivity.Stop();
    }
}