Nunit 中是否有 [OneTimeSetup] 的替代方案?

Is there any alternative to [OneTimeSetup] in Nunit?

在我现有的 [OneTimeSetup] 方法中,我想在 运行 任何测试之前检查一些先决条件。但是我不能这样做,因为我需要检查先决条件的对象是在 Base class [Setup] 方法中初始化的。由于某些项目限制,我无法提前初始化它。 那么,有什么方法可以在 Base [Setup] 方法(检查一些先决条件)之后和任何套件执行之前执行一些代码?我想每个套件执行一次。

[SetUpFixture]
Class GlobalSetup
{
   [OneTimeSetUp]
   public void OneTimeSetUp(){
      setup();
      CheckIfDataIsPresent();   // I can't do this here as this code needs Obj O to be initialized. which will be initialized in Base class's [Setup] methed
   }
}

Public class Base
{
   [Setup]
   public void setUp()
   {
      //some code where we initialize obj O; 
   }
}

[TestFixture]
public class Test : Base
{
   // tests to be executed
}

你已经很好地解释了为什么你想做的事情行不通,所以我不必再解释了。 :-)

问题是您的每个测试都需要该对象的新实例,因此您可以在 [SetUp] 方法中正确地创建它。您希望确保在 运行 任何测试之前 一次 创建这样的对象是可能的。

我只能给你一个非特定的答案,因为你没有在你的示例代码中提供很多信息。如果您更新您的问题,我也许可以更新我的答案。开始了...

  1. 您要执行的测试和检查都需要一个对象 o 的实例。因此,一种方法是在 OneTimeSetup 中再次初始化 o,执行检查,然后将其丢弃。由于您在 every 测试中初始化 o,我认为这样做并不昂贵。假设您有 100 个测试。您正在设置 o 100 次。所以让它成为 101 并完成!

  2. 或者,确定 o 成功初始化所需的条件并进行检查。例如,如果它需要一个文件存在,检查该文件是否存在。如果文件必须有 100 条某种格式的记录,请检查是否如此。也许您可以向我们提供有关这些先决条件的更多详细信息。

  3. 最后,您可能会重新考虑是否真的需要每个测试一个新实例。既然你建议你愿意为每个固定装置进行一次检查(我假设这就是你所说的套件的意思)那么也许你真的每个固定装置只需要一个实例而不是每个测试都需要一个新实例。