拆分 xUnit 测试以测试扩展方法的最佳方法

Best way to split my xUnit tests for testing an extension method

我正在尝试很好地构建我的单元测试,但我不确定拆分测试的最佳方法。我正在使用 C# 和 xUnit。

为了这个问题的目的,我正在测试这个简单的扩展方法代码:

public static bool IsNullOrEmpty(this string str)
{
    return string.IsNullOrEmpty(str);
}

我有几个关于测试的选项,但我不知道哪个是正确的。我可以写一个事实或理论。

理论 我应该使用理论吗? 一项为阳性,一项为阴性?

[Theory, IsUnit]
[InlineData(null)]
[InlineData("")]
public void Test_IsNullOrEmpty_Positive(string value)
{
     Assert.True(value.IsNullOrEmpty());
}

[Theory, IsUnit]
[InlineData("TEST")]
[InlineData(" ")]    
public void Test_IsNullOrEmpty_Negative(string value)
{ 
     Assert.False(value.IsNullOrEmpty());
}

事实 我应该使用事实吗? 正负合一:

[Fact, IsUnit]
public void Test_IsNullOrEmpty()
{
    // Positive testing.
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());

    myString = "";
    Assert.True(myString.IsNullOrEmpty());

    // Negative testing.
    myString = " ";
    Assert.False(myString.IsNullOrEmpty());

    myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

或者我应该进行单项测试:

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Null()
{
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Empty()
{
    var myString = "";
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Space()
{
    var myString = " ";
    Assert.False(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Word()
{
    var myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

我编写测试的经验不多,想遵循最佳实践,所以我只想知道以上哪一项是 C# 和 xUnit 上下文中的最佳实践(希望这个问题和这个问题有规则不是基于意见:-)).

感谢提前指点!!

我认为单个测试更有用,因为随着复杂性的增加,如果每个测试用例都有自己的测试,则故障排除会变得更容易。另外,当你在团队中开发时,如果将它们拆分为单个场景,则更容易理解测试。

实际上,这取决于您要测试的内容。如果它是您描述的扩展方法,我认为对所有断言使用一个测试应该足够了。单元测试应该快速且可读,尤其是对于扩展等常见服务。如果您需要测试业务逻辑、授权内容,并检查带有错误输入或某些异常的服务——负面测试应该像每个场景一样单独进行。恕我直言:)

[Fact]
public void StringExtension_IsNullOrEmpty_CommonBehaviour()
{
    Assert.True(((string)null).IsNullOrEmpty());
    Assert.True(string.Empty.IsNullOrEmpty());
    Assert.True("   ".IsNullOrEmpty());
    Assert.False("MyTestString".IsNullOrEmpty());
}

顺便说一句,我不想​​在解决方案项目中为这种扩展编写测试。创建一个包含所有服务功能的单独项目(具有测试覆盖率),制作一个通用的封闭包并将该项目包含到您的业务解决方案中。然后你可以像依赖第三方库一样依赖它。