对于rspec匹配器中的模型计数,"nil不是符号"

Huy*_*Huy 12 tdd rspec ruby-on-rails capybara ruby-on-rails-3

我正在尝试编写集成测试,如果用户单击按钮,它会在数据库中创建一条新记录(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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Thi*_*ilo 16

我不认为你可以change在响应对象上使用这样的匹配器.试试这个:

expect {
  click_button "Check Prices"
}.to change{ CheckPrice.count }.by(1)
Run Code Online (Sandbox Code Playgroud)

这也使IMO更具语义意义.

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


Nyc*_*cen 15

除了语义之外,回答原始问题(获得"nil不是符号")并帮助其他可能像我一样落在这里的人:确保使用大括号{}而不是括号().

所以(正确的)

response.should change{CheckPrice.count}.by(1)
response.should change(CheckPrice, :count).by(1)
Run Code Online (Sandbox Code Playgroud)

而不是(不会工作,上面2的混合)

response.should change(CheckPrice.count).by(1)
Run Code Online (Sandbox Code Playgroud)

编辑:

推荐的expect语法相同的答案

所以(正确的)

expect{response}.to change{CheckPrice.count}.by(1)
expect{response}.to change(CheckPrice, :count).by(1)
Run Code Online (Sandbox Code Playgroud)

而不是(不会工作,上面2的混合)

expect{response}.to change(CheckPrice.count).by(1)
Run Code Online (Sandbox Code Playgroud)