在Xunit中处理多个测试用例的首选方法是什么?

Iva*_*van 12 c# nunit unit-testing xunit xunit.net

我已经迁移到使用Xunit进行NUnit的单元测试.使用NUnit,我将创建一个具有多个具有相同结果的测试用例的方法.例如,以下NUnit单元测试测试类构造函数的验证,特别是"name"变量.名称不能为null,空或空格.该测试检查是否正确抛出了ArgumentNullException:

    [Test]
    [TestCase(null)]
    [TestCase("")]
    [TestCase("     ")]
    [ExpectedException(typeof(ArgumentNullException))]
    public void Constructor_InvalidName_ExceptionThrown(string name)
    {
        // action
        make_Foo(name);
    }

    private make_Foo(string name)
    {
        return new Foo(name);
    }
Run Code Online (Sandbox Code Playgroud)

这就是我使用Xunit实现这个的方法:

    [Fact]
    public void Constructor_InvalidName_ExceptionThrown()
    {
        Assert.Throws<ArgumentNullException>(() => new Foo(null));
        Assert.Throws<ArgumentNullException>(() => new Foo(""));
        Assert.Throws<ArgumentNullException>(() => new Foo("    "));
    }
Run Code Online (Sandbox Code Playgroud)

这看起来很糟糕有两个原因 - 我在应该是一个"单元"测试中有多个断言,并且测试用例埋在方法中(在一些其他单元测试中可能会变得更加复杂).

在Xunit中处理多个测试用例的首选方法是什么?

Ale*_*ker 14

您可以使用该Theory属性具有相同的效果:

[Theory()]
[InlineData(null)]
[InlineData("")]
[InlineData("     ")]
public void Constructor_InvalidName_ExceptionThrown(string name)
{
    Assert.Throws<ArgumentNullException>(() => new Foo(name));
}
Run Code Online (Sandbox Code Playgroud)

我不确定xUnit是否具有等效的属性ExpectedException.如果有,我不会用它.

使用是一个 ExpectedException在xUnit的属性,但它已被赞成不赞成Assert.Throws.