我正在尝试在所有测试之前-更具体地说-在评估所有测试用例源之前执行一些代码。
假定工作解决方案未执行代码(评估了测试用例源后,命中了断点):
[SetUpFixture]
public class GlobalSetup
{
[OneTimeSetUp]
public void Setup()
{
// Unfortunately does stuff after TestCaseSources
}
}
我设法通过使用静态构造函数创建一个伪造的测试治具来实现这一目标:
[TestFixture]
public class GlobalSetup
{
//Step 1
static GlobalSetup ()
{
// Does stuff before every other TestCaseSource
}
//Step 3
[Test, TestCaseSource (nameof (GlobalSetup.TestInitializerTestCaseData))]
public void Setup () { }
//Step 2
public static IEnumerable TestInitializerTestCaseData => new[] { new TestCaseData () };
}
不使用此替代方法的正确方法是什么?
答案 0 :(得分:0)
正如所引用的Pablo notPicasso问题中的注释所表明的那样,您正在尝试以不被设计为使用NUnit的方式使用它。当然可以进行全局设置,但是它会在所有其他测试执行之前运行。测试用例源被评估为测试发现的一部分,该测试必须完整才能开始执行任何测试。
通常可以通过减少TestCaseSource中完成的工作量来使用全局设置。无论如何,这都是理想的-TestCaseSource应该始终尽可能轻巧。
您的示例并未确切说明加载测试之前要执行的操作。如果您添加更多信息,我可以优化此答案。同时,这里有几个示例...
如果您的TestCaseSource正在创建您要测试的对象的实例,请不要这样做。相反,请初始化将在SetUp或OneTimeSetup中用于测试的参数,例如字符串和整数。
如果您的TestCaseSource正在初始化数据库,则不要这样做。而是保存初始化数据库并在测试层次结构中某个级别的OneTimeSetUp中进行操作所需的参数。
希望您有主意...或提供有关您正在做的事情的进一步信息。
您选择的解决方法看起来将在当前实现中起作用。但是,这取决于NUnit在内部执行操作的确切顺序(未指定)。在将来的版本中,它很可能会停止工作。