20

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?

2
  • 1
    XUnit has a type called Theory that you can use. Commented Aug 6, 2015 at 8:48
  • For an example of XUnit's Theory attribute: look here Commented Aug 6, 2015 at 8:51

1 Answer 1

33

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Theory link is broken

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.