NUnit,可以在“ValueSource”之前“设置”运行吗?

时间:2017-02-22 01:33:35

标签: c# unit-testing nunit

我有一个uni-test的基本设置:它测试一个负责索引目录中文件的类,并按需提供正确的类。 为此,我使用system.io.abstractions库提供的模拟文件系统。基本设置如下:

[TestFixture]
public class ImageDataTests
{
    private static MockFileSystem fs;
    private const int TESTNUM = 3;
    [SetUp]
    public static void Init() {
        var allnamegroups = TestSettings.NameGroupFactory(TESTNUM);
        fs = new MockFileSystem();
        foreach (string[] namegroup in allnamegroups) {
            var dname = ImageData.MakeDirectoryName(namegroup[0], namegroup[1]);
            TestSettings.AddTestFilesToMockFileSystem(fs, dname);
        }
    }
}

现在每个测试都适用于此案例,并测试(说)“重新加载”函数我将以下方法添加到上面的类中:

    public static IEnumerable<ImageData> ImgDatSource() {
        while (true) {
            yield return new ImageData("test", fs);
        }
    }
    [Test, Sequential]
    public void GetAllOfTypeTest(
        [ValueSource(nameof(ImgDatSource))] ImageData img, 
        [Values("foo", "bar", "this")]string type, 
        [Values(1, 2, 0)]int ex) {
        Assert.That(() => img.GetAllOfType(type).Count(), Is.EqualTo(ex));
    }

这应该(现在)列出分别以“foo”,“bar”和“this”开头的所有文件。 - 它失败,说明找不到目录。 - 甚至在第一次测试运行之前:初始化Imagedata。 调试验证了我的想法:当Init()尝试初始化输入时,ValueSource尚未运行。

是否有办法进行“此类”测试,而不是初始化测试体内的Imagedata? (要么丢失参数构造+测试索引,要么必须手动编写许多类似的测试)。

请注意,我真的需要在每个测试中运行文件系统生成器:虽然上面的测试很简单,并没有做太多。一些测试将调整/更改文件系统以针对更多边缘情况测试类。 - 同样在测试期间。

1 个答案:

答案 0 :(得分:0)

NUnit的执行有两个阶段:加载(发现)测试和运行测试。 OneTimeSetUp,SetUp,测试方法执行,TearDown和OneTimeTearDown都是运行测试的一部分。

在运行测试之前,正如您所料,进行测试加载。您的数据源(TestCaseSource或ValueSource)都在加载阶段运行。

这导致两个结论: 1. SetUp和其他测试执行方法中的任何内容都不可能对用于测试的数据产生影响。 2.您的数据源需要提供允许您在运行时创建对象的数据参数,而不是对象本身。

在您的示例中,我将更改测试方法以获取四个参数,将img替换为“test”和fs。我会在每个测试的开头添加一行,通过调用在Init之后建模的辅助方法来创建imagedata。