gpt4 book ai didi

Ruby 的大小写相等运算符 (`===` ) 对于 RSpec 的 `expect` 是倒退的

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:48 24 4
gpt4 key购买 nike

我正在运行一堆数据驱动的规范,预期的数据在不同的类中(因为有时我必须使用正则表达式,因为输出字符串每次都会更改但始终遵循特定格式)。

Ruby 的大小写相等运算符 === 是一个可以完美检查它们的表达式。问题在于它与大多数 Ruby 表达式相比是反向工作的,有时操作是不对称的:

/rgx a/ === b # equivalent to b =~ /rgx a/
ClassA === b # equivalent to b.is_a? ClassA

在我的规范上下文中,这意味着我必须以错误的方式放置操作数:

[Class, /regex/, 'string'].each do |expected_data|
it { expect(expected_data).to be === actual_data }
end

这会导致错误的失败消息:

expected: === "Actual data"
got: "Expected data"

有没有办法反转或者===运算符或者expect语法?

最佳答案

如果归结为它,您可以为此定义自己的匹配器:

describe 'reverse case eq' do
it { expect('regex').to reverse_case_eq /regex/ }
it { expect('bad match').to reverse_case_eq /regex/ } # fails
end

RSpec::Matchers.define :reverse_case_eq do |expected|
match do |actual|
expected === actual
end
end

这种情况下的错误信息如下:

 Failure/Error: it { expect('bad match').to reverse_case_eq /regex/ }
expected "bad match" to reverse case eq /regex/

还可以添加

  failure_message do |actual|
"expected #{expected.inspect} to === #{actual.inspect}"
end

到定义 block ,然后失败消息将变为

Failure/Error: it { expect('bad match').to reverse_case_eq /regex/ }
expected /regex/ to === "bad match"

如果您发现自己经常遇到此用例,这可能是首选。

关于Ruby 的大小写相等运算符 (`===` ) 对于 RSpec 的 `expect` 是倒退的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com