根据this awesome blog,我们可以安全地设置/获取CallContext的LogicalContext中的数据,即使使用async / await(只要使用.NET 4.5和不可变数据)。
让我们看看以下简单的程序:
...
CallContext.LogicalSetData("id", "123");
var id1 = CallContext.LogicalGetData("id");
await Task.Delay(100);
var id2 = CallContext.LogicalGetData("id");
...
当它在标准控制台程序中运行时,一切正常 - id1和id2都包含值“123”。
但是,如果在NUnit方法中运行,则id2包含NULL,而id1的值为“123”。
有什么理由说它在NUnit框架中不起作用吗?
答案 0 :(得分:2)
在NUnit的本机运行者(GUI和控制台)下运行时,包含与您发布的代码片段类似的代码片段的测试行为是正确的,即 id1 和 id2 值为“123”,你可以通过运行下面的测试并检查GUI和控制台中的输出来重现它。
[Test]
public async Task DoSomething()
{
CallContext.LogicalSetData("id", "123");
var id1 = CallContext.LogicalGetData("id");
Console.WriteLine("ID1: " + id1);
await Task.Delay(100);
var id2 = CallContext.LogicalGetData("id");
Console.WriteLine("ID2: " + id2);
}
当您使用R#来运行测试时,这是造成这种错误行为的最可能原因。
值得注意的是,即使测试 async void ,GUI和控制台下的行为也是正确的。