我试图找到最流畅的方式断言某个字符串是有效的Guid。
iterTags.GUID
是string
。
我的第一次尝试因错误而失败,因为string
未实施Guid
。好吧,我看到它在黑暗中拍摄了
iterTags.GUID.Should().BeAssignableTo<Guid>();
所以我想出了这个有效的解决方案,但它并不流利
Guid parsedGuid;
if (!Guid.TryParseExact(iterTags.GUID, "D", out parsedGuid))
Assert.Fail("iterTags.GUID: '{0}' is not a valid guid");
阅读documentation我发现没有更好的方法来做断言。
我的问题:是否流畅 断言 字符串有效 Guid
也许就像......
iterTags.GUID.Should().BeParsedAs<Guid>()
答案 0 :(得分:3)
Guid parsedGuid;
Guid.TryParseExact(iterTags.GUID, "D", out parsedGuid).Should.BeTrue("because {0} is a valid Guid string representation", iterTags.GUID);
或
new Action(() => new Guid(iterTags.GUID)).ShouldNotThrow("because {0} is a valid Guid string representation", iterTags.GUID);
答案 1 :(得分:1)
您还可以在GUID上使用not be empty
检查,这样您就可以使用 FluentAssertions的空检查:
Guid.TryParse(iterTags.GUID, out var parsedIterTagsGUID)
parsedIterTagsGUID.Should().NotBeEmpty();
或作为扩展名:
public static AndConstraint<FluentAssertions.Primitives.GuidAssertions> ShouldBeGuid(this object value, string because = "", params object[] becauseArgs)
{
Guid.TryParse(value?.ToString(), out var guid);
return guid.Should().NotBeEmpty(because, becauseArgs);
}
通过扩展类似以下内容,可以更好地完成上述工作:
public static AndConstraint<GuidAssertions> BeGuid(this StringAssertions value, string because = "", params object[] becauseArgs)
{
Guid.TryParse(value.Subject, out var guid);
return guid.Should().NotBeEmpty(because, becauseArgs);
}
public static AndConstraint<GuidAssertions> BeGuid(this ObjectAssertions value, string because = "", params object[] becauseArgs)
{
return (value.Subject as Guid?).Should().NotBeNull().And.NotBeEmpty(because, becauseArgs);
}
上提出拉取请求甚至更好
答案 2 :(得分:0)
受Nick N 的回答启发,我最终采用了以下方法。
主要区别在于失败消息更清楚地说明字符串不是 GUID,其中 NotBeEmpty
条件将返回一条消息,说明输入为空。
public static class CustomAssertions
{
public static AndConstraint<StringAssertions> BeGuid(this StringAssertions assertions, string because = "", params object[] becauseArgs)
{
var isGuid = Guid.TryParse(assertions.Subject, out _);
Execute.Assertion
.ForCondition(isGuid)
.BecauseOf(because, becauseArgs)
.FailWith("Expected a GUID converted to a string{reason}, but found {0}.", assertions.Subject);
return new AndConstraint<StringAssertions>(assertions);
}
}