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