Ruby 如何将消息附加到RSpec检查?

Ruby 如何将消息附加到RSpec检查?,ruby,tdd,rspec,xunit,Ruby,Tdd,Rspec,Xunit,在RSpec中:我可以像在xUnit风格的测试框架中那样将消息附加到检查吗?怎么做 assert_equal value1,value2,'有什么不对劲' 在RSpec中,匹配者的工作是打印一条合理的故障消息。RSpec附带的泛型匹配器显然只能打印泛型非描述故障消息,因为它们对您的特定域一无所知。这就是为什么建议您编写自己的特定于域的匹配器,这将为您提供更可读的测试和更可读的失败消息 以下是来自以下方面的示例: 注意:仅需要匹配,其他将自动生成。但是,您的问题的全部要点当然是您不喜欢默认消息,因

在RSpec中:我可以像在xUnit风格的测试框架中那样将消息附加到检查吗?怎么做

assert_equal value1,value2,'有什么不对劲'

在RSpec中,匹配者的工作是打印一条合理的故障消息。RSpec附带的泛型匹配器显然只能打印泛型非描述故障消息,因为它们对您的特定域一无所知。这就是为什么建议您编写自己的特定于域的匹配器,这将为您提供更可读的测试和更可读的失败消息

以下是来自以下方面的示例:

注意:仅需要
匹配
,其他将自动生成。但是,您的问题的全部要点当然是您不喜欢默认消息,因此您至少还需要为\u should定义
failure\u message\u

此外,如果在正反两种情况下需要不同的逻辑,您还可以定义
match_for_should
match_for_should
而不是
match

正如@chrisjohnsen所显示的,您还可以显式地向期望传递消息。但是,您可能会失去可读性优势

比较一下:

user.permissions.should be(42), 'user does not have administrative rights'
为此:

user.should have_administrative_rights
这将(大致)实现如下:

require 'rspec/expectations'

RSpec::Matchers.define :have_administrative_rights do
  match do |thing|
    thing.permissions == 42
  end
  failure_message_for_should do |actual|
    'user does not have administrative rights'
  end
  failure_message_for_should_not do |actual|
    'user has administrative rights'
  end
end
对于RSpec 3+:

消息可以自定义为字符串或使用proc(检查引用)

expect(1)。对于等式(2),“一不是两!”
自定义消息 RSpec试图提供有用的失败消息,但对于您需要更多的情况 具体信息,您可以在示例中定义自己的消息。这适用于 除操作员匹配器以外的任何匹配器


对于较旧的RSpec版本

并获取第二个参数(
message
),该参数覆盖匹配器的默认消息

1.应该是(2),“一个不是两个!”

不过,默认消息通常非常有用。

在我的例子中,这是一个括号问题:

        expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"
这导致了错误数量的参数,而正确的方法是:

        expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"

谢谢,我不知道定义匹配器的标准方法有那么简单。尽管我更喜欢“懒惰”:当这些东西出现至少两次时,将它们分解成单独的命名实体,或者显著简化它们使用的上下文。如何使用
#should==
?@mohawkjohn:看起来像是
1.should(nil,'一不是二!'==2
(ick),但是这确实有效,因为
=
操作符匹配器看起来总是生成自己的消息。您也可以使用
eq
而不是
=
,即
1。应该eq(nil),“一不是二!”最终我找到了这个解决方案。非常感谢。是的,那是给我的。使用
.to be(true)
        expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"