Fluent断言将字符串与Guid进行比较

时间:2014-01-23 12:00:43

标签: c# fluent-assertions

我试图找到最流畅的方式断言某个字符串是有效的Guid。

iterTags.GUIDstring

我的第一次尝试因错误而失败,因为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>()

3 个答案:

答案 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);
    }

或者通过在https://github.com/fluentassertions/fluentassertions

上提出拉取请求甚至更好

答案 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);
    }
}