12

我正在尝试编写一个集成测试,如果用户单击一个按钮,它会在数据库中创建一个新记录(CheckPrice 模型)。

nil is not a symbol当我尝试运行测试时遇到了错误。

require 'spec_helper'

describe 'CheckPrice', type: :request, js: true  do
  it "should create a new CheckPrice record when user clicks Check Price on topic page" do
    city = create :city
    hotel = create :hotel
    affiliate_link = create :affiliate_link

    visit '/hotel-bilboa-hotel'
    sleep 2
    click_button "Check Prices"
    response.should change(CheckPrice.count).by(1)
  end
end

单击“检查价格”时,有一个事件侦听器会触发 checkprices_controller 中的新方法。

错误似乎发生在最后一行response.should change(CheckPrice.count).by(1)。看起来该方法无法识别模型 CheckPrice。如何引用 CheckPrice 表?

谢谢。

4

4 回答 4

16

我认为您不能change在响应对象上使用这样的匹配器。尝试这个:

expect {
  click_button "Check Prices"
}.to change{ CheckPrice.count }.by(1)

这也更具有语义意义,IMO。

有关更多示例,请参阅此备忘单

于 2012-11-05T20:58:34.027 回答
15

抛开语义不谈,要回答最初的问题(得到“nil 不是符号”)并帮助可能像我一样登陆这里的其他人:确保使用大括号 {} 而不是括号 ()。

所以(正确)

response.should change{CheckPrice.count}.by(1)
response.should change(CheckPrice, :count).by(1)

而不是(不起作用,以上两种的混合)

response.should change(CheckPrice.count).by(1)

编辑:

推荐的期望语法相同的答案

所以(正确)

expect{response}.to change{CheckPrice.count}.by(1)
expect{response}.to change(CheckPrice, :count).by(1)

而不是(不起作用,以上两种的混合)

expect{response}.to change(CheckPrice.count).by(1)
于 2013-07-01T22:22:16.940 回答
1

另一种方法是:

expect do
    click_button "Check Prices"
end.to change(CheckPrice, :count).by(1)

这表明count方法的输出CheckPrice是应该改变的。当两个参数被传递给 时change,一个被假定为接收者,另一个被假定为要发送的符号。

于 2013-03-26T04:18:57.343 回答
0

I ran into the same problem, the case is, as the other answers says, that both the methods expect and change, in this case, expect a block as parameter.

So, in rails, you can use either { } or do end syntaxes.

于 2014-09-02T20:30:01.513 回答