C# 迅特理论以参数为指导

C# 迅特理论以参数为指导,c#,xunit,C#,Xunit,我有一个扩展方法,它测试字符串是否为GUID public static bool IsGuid(this string str) { if(str == null) throw new ArgumentNullException(str, "Argument can not be NULL"); Guid guidFromString; return Guid.TryParse(str, out guidFromString); } 我想通过xUnit

我有一个扩展方法,它测试字符串是否为GUID

public static bool IsGuid(this string str)
{
    if(str == null)
        throw new ArgumentNullException(str, "Argument can not be NULL");
    Guid guidFromString;
    return Guid.TryParse(str, out guidFromString);
}
我想通过xUnit和理论来测试它。
对于正在工作的字符串:

[Theory, InlineData(""), InlineData(" ")]
public void IsGuid_EmptyOrWhiteSpace_ShouldReturnFalse(string str)
{
    // Arrange
    bool result;

    // Act
    result = str.IsGuid();

    // Assert
    Assert.False(result);
}
但是我怎样才能为guid数组做到这一点呢?我需要测试
Guid.Empty'和
Guid.NewGuid`

这不起作用:

[Theory, MemberData(nameof(Guids))]
public void IsGuid_EmptyOrValidGuid_ShouldReturnTrue(string str)
{
    // Arrange
    bool result;

    // Act
    result = str.IsGuid();

    // Assert
    Assert.False(result);
}

public static IEnumerable<string> Guids
{
    get
    {
        yield return Guid.Empty.ToString();
        yield return Guid.NewGuid().ToString();
    }
}
[理论,成员数据(名称(GUID))]
public void IsGuid_EmptyOrValidGuid_ShouldReturnTrue(字符串str)
{
//安排
布尔结果;
//表演
结果=str.IsGuid();
//断言
Assert.False(结果);
}
公共静态IEnumerable GUID
{
得到
{
产生返回Guid.Empty.ToString();
产生返回Guid.NewGuid().ToString();
}
}
@编辑 测试失败是因为

System.ArgumentException
Property Guids on ExtensionsLibraryTests.StringExtensions.xUnitStringExtensionsTests yielded an item that is not an object[]
   at Xunit.MemberDataAttribute.ConvertDataItem(MethodInfo testMethod, Object item)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Xunit.Sdk.XunitTheoryTestCaseRunner.<AfterTestCaseStartingAsync>d__7.MoveNext()
System.ArgumentException
ExtensionLibraryTests.StringExtensions.xUnitStringExtensionsTests上的属性GUID生成的项不是对象[]
位于Xunit.MemberDataAttribute.ConvertDataItem(MethodInfo testMethod,对象项)
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在Xunit.Sdk.xUnitTheryTestCaseRunner.d_u7.MoveNext()中

您的测试方法当前只有一个参数-字符串-但情况并非如此。如果您的测试方法有3个参数呢?您是如何将其打包到
IEnumerable

因此,当您使用xUnit的“属性数据”功能时,xUnit要求该属性采用
IEnumerable

公共静态IEnumerable GUID
{
得到
{
产生返回新对象[]{”“};
产生返回新对象[]{”“};
}
}
这应该解决眼前的问题。但是,我鼓励您尝试以下布局:

[Theory, MemberData(nameof(Guids))]
public void thinkofsomesmartname(bool expectedResult, string text)
{
    bool result = text.IsGuid();

    Assert.Equal(expectedResult, result);
}

public static IEnumerable<object[]> Guids
{
    get
    {
        yield return new object[]{ false, "" };
        yield return new object[]{ false, " " };
        yield return new object[]{ true, Guid.NewGuid().ToString() };
    }
}
[理论,成员数据(名称(GUID))]
SomeSmartName(bool expectedResult,字符串文本)的公共无效thinkofsomesmartname
{
bool result=text.IsGuid();
Assert.Equal(expectedResult,result);
}
公共静态IEnumerable GUID
{
得到
{
返回新对象[]{false,“};
返回新对象[]{false,“};
返回新对象[]{true,Guid.NewGuid().ToString()};
}
}
当然,通过数据集传递“预期结果”有点麻烦,这使得发明测试名称有点困难。您可以创建两个数据集:错误和正确,并创建两个测试方法,一个是Assert.False,另一个是Assert.True。。但由于它是一个非常简单的测试,而且它是高度数据驱动的,所以我喜欢这样写


顺便说一下,这个例子还向您展示了为什么IEnumerable:中的
object[]
而不仅仅是
string
可以有很多参数

嘿。。可能只是
产生了返回Guid.NewGuid().ToString()返回一个有效的GUID,并且您的测试有Assert.False?要使这段代码与前一段代码相同(
InlineData(“”),InlineData(“”
),您应该
yield return”“;收益率回报率“而不是有效的Guid字符串..修复AAA节:)可能重复:(抱歉,我无法重复投票,因为我撤消了以前的“不清楚”投票..)
[Theory, MemberData(nameof(Guids))]
public void thinkofsomesmartname(bool expectedResult, string text)
{
    bool result = text.IsGuid();

    Assert.Equal(expectedResult, result);
}

public static IEnumerable<object[]> Guids
{
    get
    {
        yield return new object[]{ false, "" };
        yield return new object[]{ false, " " };
        yield return new object[]{ true, Guid.NewGuid().ToString() };
    }
}