gpt4 book ai didi

c# - 如何在 NUnit 测试中实现静态 'test local' 数据?

转载 作者:行者123 更新时间:2023-11-30 23:03:55 24 4
gpt4 key购买 nike

我有一个库的几千个 NUnit 测试,其中许多依赖于具有一些静态可用的“请求上下文”,该“请求上下文”的范围限定为所服务的请求并跨任务流动。库使用者提供一个实现来检索当前请求上下文。

我需要实现一些东西来为我们的 NUnit 测试项目提供上下文,其中上下文的范围限定为每个单独的测试运行;每个测试运行都应该有它自己的对象,并且我应该能够在测试期间从任何地方访问它。

最初,我是使用 TestContext.Current.Properties 并将我的请求上下文存储在那里实现的,但是随着最近的 NUnit 更新,Properties 已变为只读。

是否有任何替代品可用于实现“测试本地”数据?即在当前测试运行范围内的东西,并且可以静态访问。

最佳答案

Similar issue在 github 上包含来自 NUnit 开发人员的以下声明:

However, it's not intended that you should change the properties of an NUnit Test, because Test and its derivatives are internal and the implementation can change. The internal classes allow it because custom attributes may need to do it, but I recommend that tests avoid doing it.

而且这样的实现变化确实发生了。在 NUnit 2.6.0 之前,TestContextProperties 包,但是从 2.6.0 开始它被移动到 TestAdapter。您仍然可以通过 TestContext.CurrentContext.Test.Properties 访问它,但是您不能保证将来不会再次更改。

实现这种上下文访问器的更简洁的方法是添加简单的持有者,它将当前测试与为其创建当前上下文实例的测试进行比较。如果这些测试不匹配,它只会创建一个新的上下文实例并记住当前测试。

这是一个工作示例:

internal static class ContextAccessor
{
private static TestExecutionContext currentRequestTest;

private static RequestContext currentRequestContext;

public static RequestContext Current
{
get
{
var currTest = TestExecutionContext.CurrentContext;

if (currentRequestTest == currTest)
{
return currentRequestContext;
}

currentRequestContext = CreateRequestContext();
currentRequestTest = currTest;

return currentRequestContext;
}
}

public static RequestContext CreateRequestContext()
{
return new RequestContext();
}
}

RequestContext 这是您的上下文类。 CreateRequestContext() 基本上是一个创建上下文的工厂方法。您可以放置​​创建新上下文实例所需的任何逻辑。

现在在测试中你可以调用ContextAccessor.Current:

[Test]
public void SomeTest()
{
var context1 = ContextAccessor.Current;
var context2 = ContextAccessor.Current;

Assert.AreSame(context1, context2);
}

Sample Project on GitHub

关于c# - 如何在 NUnit 测试中实现静态 'test local' 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49683601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com