在 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();
}
}
我的网站 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();
}
}