4

我在这样的验证中测试了很多错误的字符串:

['0', '3:a', 'xx:11', '-1', '-3:00', 'h', 'h2', 'h2h', 'm', 'm10', 'm10m', '2hm', 'h2m', 'hm2', '2m10h', '2m10m', '2h10h'].each do |input|
  FactoryGirl.build(:time_record, duration_string: input).should have(1).error_on('duration_string'), "Tested value was '#{input}'"
end

可悲的是,当其中一个失败时,消息expected 1 error on :duration_string, got 0并没有告诉我,哪一个失败了。我知道我可以传递显示的第二个参数,而不是像这样的默认消息:

x.should have(1).error_on('duration_string'), "Tested value was '#{input}'"

但这隐藏了原始消息。有没有办法只将我自己的消息附加到原始消息而不是替换它?

谢谢你。

4

2 回答 2

6

您可以使用另一条消息捕获并重新引发异常:

['0', '3:a', 'xx:11', '-1', '-3:00', 'h', 'h2', 'h2h', 'm', 'm10', 'm10m', '2hm', 'h2m', 'hm2', '2m10h', '2m10m', '2h10h'].each do |input|
  begin
    FactoryGirl.build(:time_record, duration_string: input).should  have(1).error_on('duration_string'), "Tested value was '#{input}'"
  rescue RSpec::Expectations::ExpectationNotMetError => e
    e.message << "failed at #{input}"
    raise e
  end
end
于 2013-03-13T18:08:25.613 回答
1

我是这样解决的:

['0', '3:a', 'xx:11', '-1', '-3:00', 'h', 'h2', 'h2h', 'm', 'm10', 'm10m', '2hm', 'h2m', 'hm2', '2m10h', '2m10m', '2h10h'].each do |input|
  it "does not accept #{input}" do
    FactoryGirl.build(:time_record, duration_string: input).should have(1).error_on('duration_string'), "Tested value was '#{input}'"
  end
end

通过这种方式,您还可以廉价地获得更高规格的统计数据。;)

于 2013-03-14T08:07:16.173 回答