Fluent Assertions - null 和空字符串比较 [关闭]

Posted

技术标签:

【中文标题】Fluent Assertions - null 和空字符串比较 [关闭]【英文标题】:Fluent Assertions - null and empty string comparison [closed] 【发布时间】:2021-03-20 03:40:52 【问题描述】:

是否可以强制流利的断言通过 Should().Be() 来比较空字符串和空字符串?或者也许这可以通过 BeEquivalentTo 以某种方式完成?

例子:

text1.Should().Be(text2);

我希望上面的代码在以下情况下通过:

text1 将是 'foo' 而 text2 将是 'foo'(只是标准行为) text1 为空字符串,text2 为空

所以我需要做出可以比较字符串的断言,但如果其中一个为空而另一个为空,它仍然应该通过。

一些上下文:

我需要它来进行硒自动测试。我有一些 Dto,我将其发送到 api 以创建产品表作为测试先决条件(Dto 的某些字段可以为空)。然后在应用程序的 UI 中,此 null 显示为空字符串。稍后在测试中,我正在检查每列是否存在正确的数据,并且我希望能够使流利的断言在空字符串和 null 之间传递断言(当然,如果比较两个正确的字符串仍然可以通过 -> 当没有 Dto 字段时空)。

【问题讨论】:

这能回答你的问题吗? Fluent assertion for OR condition 【参考方案1】:

你可以使用 AssertionScope

 string text1 = "";
        string text2 = null;
        using (new AssertionScope())
        
            test1.Should().BeOneOf("foo", null, "");
            test2.Should().BeOneOf("foo", null, "");
        ;

【讨论】:

正如我所说,Dto 的这个字段“可以”为空,但在大多数情况下,我会将它们与字符串一起使用。如果我将填写 Dto 的所有字段,那么在 UI 中我会看到正确的字符串。所以我不能使用 BeNullOrEmpty() 选项,因为它并不总是空的 即使 text1 为空,这也是正确的 我已经用更好的例子更新了帖子,所以也许它会更容易得到我需要它的工作方式【参考方案2】:

您可以编写自己的流畅扩展来定义自己的断言:

    public static class FluentExtensions
    
        public static AndConstraint<StringAssertions> BeEquivalentLenient(this StringAssertions instance, string expected, string because = "", params object[] becauseArgs)
        
            Execute.Assertion
                .BecauseOf(because, becauseArgs)
                .ForCondition(beEquivalentLenient(instance.Subject, expected))
                .FailWith("Not equivalent!");

            return new AndConstraint<StringAssertions>(instance);
        

        private static bool beEquivalentLenient(string s1, string s2)
        
            if (s1.IsNullOrEmpty())
            
                return s2.IsNullOrEmpty();
            

            return s1.Equals(s2);
        
    

现在你可以像这样使用它了:

            ((string) null).Should().BeEquivalentLenient("");
            "".Should().BeEquivalentLenient(null);
            "bla".Should().BeEquivalentLenient("b"+"la");

【讨论】:

以上是关于Fluent Assertions - null 和空字符串比较 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent Assertions 引发异常?

使用 Fluent Assertions 库的多个断言

Fluent Assertions Should().BeEquivalentTo 只有私有字段

Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递

Fluent Assertions:大致比较两个 2D 矩形阵列

ShouldBeEquivalentTo 的 C# Fluent Assertions 全局选项