gpt4 book ai didi

c# - 单元测试的构造函数运行两次

转载 作者:行者123 更新时间:2023-11-30 20:30:44 25 4
gpt4 key购买 nike

我有一些测试代码正在初始化一些应该在开始时只完成一次的成员。这就是我为此使用构造函数的原因:

[TestFixture]
public class MyTestClass
{
private readonly IUnitTestGeometryProvider m_GeometryProvider;


public MyTestClass()
{
// do some heavy init-op
}

private IEnumerable<TestCaseData> TestCases()
{
yield return new TestCaseData(this.m_GeometryProvider.GetPolyline())
.Throws(typeof(ArgumentException));
}

[TestCaseSource("TestCases")]
public double Check_GetReducedArea_For_Invalid_Arguments(IGeometry theGeom)
{
return theGeom.GetReducedArea();
}
}

我知道使用 FixtureSetup 属性来初始化测试的约定,例如来自 this question on SO .但是我注意到方法 TestCases 在用该属性标记的方法之前执行,所以我在评估不同的测试用例时遇到了 NullReferenceException m_GeometryProvider 此时为 null

所以我调试了我的代码并在构造函数中设置了一个断点。我注意到,它在任何测试运行之前执行了两次。我假设每个测试用例都有自己的 MyTestClass 实例,但由于我有三个不同的测试用例并且构造函数运行两次,所以这并不能解释它。

由于初始化很繁重,我想只执行一次。有没有办法保证这一点?我想避免使用 static 成员,因为它经常吸引同事大量使用其他 static 成员,只是因为已经有一个成员。此外,我认为 test-init 特定于我的 MyTestClass 的一个实例,而不是类本身 - 假设只有一个实例。

我正在使用 NUnit 2.5.10。

最佳答案

基本上,NUnit 保留在需要时和需要时构造您的夹具对象的权利。因此,您应该避免在构造函数中进行繁重的初始化,尤其是在仅在运行测试时才需要进行某些初始化的情况下。

通常,执行测试的初始化应在 TestFixtureSetUp 方法中完成,该方法在每次执行夹具时运行一次且仅运行一次。但是,当您使用 TestCaseSource 属性生成测试用例时,这会更加复杂。

因为必须首先执行测试用例才能创建您的测试,在它们运行之前很久,必须创建对象的实例来执行此操作。然后,当运行测试时,会创建另一个实例来运行它们。您的问题中没有足够的信息来弄清楚为什么对您的构造函数有两次“额外”调用,但这要么是由于您的代码的其他方面,要么仅仅是您使用的 NUnit 的旧版本中的错误。您将不得不逐步执行这些构造函数调用并检查堆栈跟踪以查看调用它们的内容。

除了 TestCases 方法之外,您的 m_GeometryProvider 成员是否在其他任何地方使用过?如果没有,您可以通过将其设为在该方法中创建的临时字段来简化操作。然后,您可以通过将 TestCases 方法设为静态来消除额外的构造函数调用。你说你不喜欢那样,但这是我们推荐的。事实上,在 NUnit 3.0 及更高版本中,它需要是静态的。

如果除了创建几何提供程序之外还需要运行测试所需的其他初始化,则应将其放入 TestFixtureSetUp 方法中。

关于c# - 单元测试的构造函数运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44322639/

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