3

我是一个尝试学习的 rails/rspec 新手。我已经设置了以下数据模型(摘录)

t.string :foo
t.string :bar
t.date :future_date

我有一个 Web 表单来创建与用户关联的这些条目,类似于这个rails 教程中的微博。Web 表单如下所示(摘录):

<%= f.label :foo %>
<%= f.text_field :foo %>
<%= f.label :bar %>
<%= f.text_field :bar %>
<%= f.date_select :future_date %>

使用“创建”按钮启动帖子。一切似乎都可以通过 rails 控制台正常工作;Web 表单显示正确,条目创建正确,数据库正确填充。但是,当我运行 rspec 我得到

NoMethodError:
  undefined method `call' for #<RSpec::Expectations::ExpectationTarget:0x0000000492b7c0>

这是相关的请求规范(摘录):

it "should not create a foobar" do
  expect { click_button "Create" }.should_not change(Foobar, :count)
end

换句话说,单击“创建”而不填写任何信息。稍后我有一个类似的示例,其中填写了信息,但几乎相同的 click_button 也会引发此错误(应该更改 .by(1))。我有类似的 click_button 测试对于用户创建部分(没有输入/输入的内容)工作正常,除了 future_date 之外,它非常相似。这一点,加上我在无休止的谷歌搜索中遇到的一些事情,让我相信日期在某种程度上是罪魁祸首,也许是版本不一致或其他原因。特别是因为在实际使用中一切正常。这适用于 ruby​​ 1.9.3、Rails 3.2.6 和 Rspec 2.11.1。非常感谢任何见解。

4

2 回答 2

10

在 RSpec >= 2.11 你应该使用to方法而不是should

expect { click_button "Create" }.to_not change(Foobar, :count)
于 2012-07-31T18:51:37.163 回答
2

应该说...

it "should not create a foobar" do
  lambda { click_button "Create" }.should_not change(Foobar, :count)
end

... 所以lambda,不是expect

于 2012-07-31T06:36:50.030 回答