我已经迁移到使用Xunit进行NUnit的单元测试。使用NUnit,我将创建一个具有多个具有相同结果的测试用例的方法。例如,以下NUnit单元测试测试类构造函数的验证,特别是" name"变量。名称不能为空,空或空格。测试检查是否正确抛出了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);
}
这就是我使用Xunit实现这个的方法:
[Fact]
public void Constructor_InvalidName_ExceptionThrown()
{
Assert.Throws<ArgumentNullException>(() => new Foo(null));
Assert.Throws<ArgumentNullException>(() => new Foo(""));
Assert.Throws<ArgumentNullException>(() => new Foo(" "));
}
这看起来很糟糕有两个原因 - 我有多个Asserts应该是一个&#34; unit&#34;测试,并将测试用例隐藏在方法中(在某些其他单元测试中可能会变得更加复杂)。
在Xunit中处理多个测试用例的首选方法是什么?
答案 0 :(得分:13)
您可以使用Theory
属性获得相同的效果:
[Theory()]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Constructor_InvalidName_ExceptionThrown(string name)
{
Assert.Throws<ArgumentNullException>(() => new Foo(name));
}
我不确定xUnit是否具有等同于 ExpectedException
的属性。如果有I would not use it。
使用作为xUnit中的ExpectedException
属性,但此后一直是deprecated in favour of Assert.Throws
。