在 Xunit 中处理多个测试用例的首选方法是什么?
What is the preferred way to handle multiple test cases in Xunit?
我已经从 NUnit 迁移到使用 Xunit 进行单元测试。使用 NUnit,我将创建一个方法,其中包含具有相同结果的多个测试用例。例如,下面的 NUnit 单元测试测试 class 构造函数的验证,特别是 "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);
}
这就是我使用 Xunit 实现它的方式:
[Fact]
public void Constructor_InvalidName_ExceptionThrown()
{
Assert.Throws<ArgumentNullException>(() => new Foo(null));
Assert.Throws<ArgumentNullException>(() => new Foo(""));
Assert.Throws<ArgumentNullException>(() => new Foo(" "));
}
这看起来很糟糕有两个原因 - 我在应该是 "unit" 的测试中有多个断言,并且测试用例隐藏在方法中(这在某些情况下可能会变得更加复杂其他单元测试)。
在 Xunit 中处理多个测试用例的首选方法是什么?
您可以使用 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
。
我已经从 NUnit 迁移到使用 Xunit 进行单元测试。使用 NUnit,我将创建一个方法,其中包含具有相同结果的多个测试用例。例如,下面的 NUnit 单元测试测试 class 构造函数的验证,特别是 "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);
}
这就是我使用 Xunit 实现它的方式:
[Fact]
public void Constructor_InvalidName_ExceptionThrown()
{
Assert.Throws<ArgumentNullException>(() => new Foo(null));
Assert.Throws<ArgumentNullException>(() => new Foo(""));
Assert.Throws<ArgumentNullException>(() => new Foo(" "));
}
这看起来很糟糕有两个原因 - 我在应该是 "unit" 的测试中有多个断言,并且测试用例隐藏在方法中(这在某些情况下可能会变得更加复杂其他单元测试)。
在 Xunit 中处理多个测试用例的首选方法是什么?
您可以使用 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
。