使用rspec测试自定义验证器。为什么我得到Proc?

时间:2012-11-17 18:15:34

标签: ruby-on-rails ruby ruby-on-rails-3 rspec tdd

正如标题所示,我正在尝试使用Rspec测试自定义验证器。我得到一个错误,我不明白为什么......如果你能解释一下,我会非常感激。我们走了:

验证码规范

require 'spec_helper'

describe GraphDateValidator do

  it "should not validate activity with empty start time" do
    expect { Graph.new( {start_time: ''}).valid? }.to eq(false)
  end
end

如果我打印Graph.new( {start_time: ''}).valid?,则会打印false

然而,当它通过规范时,它返回一个Proc对象:

expected: false
            got: #<Proc:0x007fe5853fdd48@/Users/MLP/...

有人能告诉我为什么我要获得那个proc对象吗?谢谢!

2 个答案:

答案 0 :(得分:15)

通过在期望中使用{},那么你真的没有执行expect方法 - 而是你发送期望一个块。所以重命名为

it "should not validate activity with empty start time" do
  expect( Graph.new( {start_time: ''}).valid? ).to eq(false)
end

答案 1 :(得分:-2)

对于更好的样式和失败消息,您可以使用rspec的谓词匹配器:

it "does not accept empty start time" do
  Graph.new( {start_time: ''}).should_not be_valid
end

编辑1(解释风格品味):

这为您提供了可读的错误消息,例如“预期$ foo有效,但不是”而不是“true应该为false”。

对于“更好的风格”,我引用了Matcher的使用(正如我所写),而不是should。因此,以下内容不会使用已弃用的语法,但仍使用匹配器:

it "does not accept empty start time" do
  expect( Graph.new( {start_time: ''}) ).to be_valid
end