简体   繁体   中英

What is the preferred way to handle multiple test cases in Xunit?

I have migrated to using Xunit for unit tests from NUnit. With NUnit, I would create one method with multiple test cases that have the same outcome. For example, the following NUnit unit test tests the validation of a class constructor, specifically the "name" variable. The name can't be null, empty or whitespace. The test checks that an ArgumentNullException is correctly thrown:

    [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);
    }

This is how I have implemented this using Xunit:

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

This seems bad for two reasons - I have multiple Asserts in what is supposed to be a "unit" test, and with the test cases buried within the method (which could get a lot more complicated in some of the other unit tests).

What is the preferred way to handle multiple test cases in Xunit?

You can use the Theory attribute to the same effect:

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

I am not sure if xUnit has am attribute equivalent to ExpectedException however. If there is, I would not use it .

There used to be an ExpectedException attribute in xUnit but it has since been deprecated in favour of Assert.Throws .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM