流畅的断言:断言一个或另一个值

Posted

技术标签:

【中文标题】流畅的断言:断言一个或另一个值【英文标题】:Fluent assertions: Assert one OR another value 【发布时间】:2014-10-21 22:11:25 【问题描述】:

使用流利的断言,我想断言给定的字符串包含两个字符串之一:

actual.Should().Contain("oneWay").Or().Should().Contain("anotherWay"); 
// eiter value should pass the assertion.
// for example: "you may do it oneWay." should pass, but
// "you may do it thisWay." should not pass

只有两个值都不包含时,断言才会失败。这不起作用(甚至无法编译),因为没有 Or() 运算符。

这就是我现在的做法:

bool isVariant1 = actual.Contains(@"oneWay");
bool isVariant2 = actual.Contains(@"anotherWay");
bool anyVariant = (isVariant1 || isVariant2);
anyVariant.Should().BeTrue("because blahblah. Actual content was: " + actual);

这很冗长,必须手动创建“因为”参数才能获得有意义的输出。

有没有办法以更易读的方式做到这一点?解决方案也应该适用于其他流畅的断言类型,如Be()HaveCount() 等...

我在 .NET 3.5 上使用 FluentAssertions 版本 2.2.0.0,如果这很重要的话。

【问题讨论】:

【参考方案1】:

您可以通过编写一个简单的字符串扩展使其更具可读性:

public static class StringExt

    public static bool ContainsAnyOf(this string self, params string[] strings)
    
        return strings.Any(self.Contains);
    

那么你可以这样做:

actual.ContainsAnyOf("oneWay", "anotherWay").Should().BeTrue("because of this reason");

不幸的是,这对信息的“原因”部分没有帮助,但我认为这要好一些。

【讨论】:

实际上,当这失败时,你不知道出了什么问题。【参考方案2】:

我会将它作为字符串断言的扩展。像这样的:

public static void BeAnyOf(this StringAssertions assertions, string[] expectations, string because, params string[] args) 
    Execute.Assertion
           .ForCondition(expectations.Any(assertions.Subject.Contains))
           .BecauseOf(because, args)
           .FailWith("Expected context:string to be any of 0reason", expectations);

您甚至可以分叉 repository 并向我提供 Pull Request 以使其成为下一个版本的一部分。

【讨论】:

这个怎么用?这错过了很多解释!如果我能创建类似这样的东西那就太好了:actual.Should().ContainAnyOf("oneWay", "another way"); 这将与现有方式一致。 它允许您拨打actual.Should().BeAnyOf("oneWay", "another way"); @DennisDomen 我如何为 Enums 实现相同的方法?【参考方案3】:

这不应该有效吗?

actual.Should().BeOneOf("oneWay", "anotherWay");

使用 v3.1.229 为我工作。

【讨论】:

不适合我,因为我不想断言整个字符串内容,而只是实际值部分包含其中一个值。

以上是关于流畅的断言:断言一个或另一个值的主要内容,如果未能解决你的问题,请参考以下文章

Swift编程语言学习1.7——断言

如何用两个不同的期望值断言一个实际值

Python3 unittest断言详解

如何在加特林中断言另一个文件中的值

如何单元测试继续断言

Python+unittest+request断言方法封装