这个问题是关于单元测试框架xUnit.net的。

在执行任何测试之前,我需要运行一些代码,在完成所有测试之后,还需要运行一些代码。我认为应该有某种属性或标记接口(interface)来指示全局初始化和终止代码,但找不到它们。

另外,如果我以编程方式调用xUnit,则也可以使用以下代码实现所需的功能:

static void Main()
{
    try
    {
        MyGlobalSetup();
        RunAllTests();  // What goes into this method?
    }
    finally
    {
        MyGlobalTeardown();
    }
}

谁能为我提供有关如何以声明方式或以编程方式运行某些全局设置/拆卸代码的提示?

最佳答案

据我所知,xUnit没有全局初始化/拆卸扩展点。但是,创建一个很容易。只需创建一个实现IDisposable的基本测试类,然后在构造函数中进行初始化,并在IDisposable.Dispose方法中进行拆卸即可。看起来像这样:

public abstract class TestsBase : IDisposable
{
    protected TestsBase()
    {
        // Do "global" initialization here; Called before every test method.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Called after every test method.
    }
}

public class DummyTests : TestsBase
{
    // Add test methods
}

但是,将为每个调用执行基类设置和拆卸代码。这可能不是您想要的,因为它不是很有效。一个更优化的版本将使用IClassFixture<T>接口(interface)来确保全局初始化/拆卸功能仅被调用一次。对于此版本,您无需从测试类扩展基类,而是实现IClassFixture<T>接口(interface),其中T指代您的灯具类:
using Xunit;

public class TestsFixture : IDisposable
{
    public TestsFixture ()
    {
        // Do "global" initialization here; Only called once.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Only called once.
    }
}

public class DummyTests : IClassFixture<TestsFixture>
{
    public DummyTests(TestsFixture data)
    {
    }
}

这将导致TestsFixture的构造函数仅运行一次
对于每个被测类(class)。因此,这取决于您要在两种方法之间准确选择的内容。

关于c# - xUnit.net:全局设置+拆卸?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12976319/

10-09 06:01