C# 迅特理论以参数为指导
我有一个扩展方法,它测试字符串是否为GUIDC# 迅特理论以参数为指导,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
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() };
}
}