RSPEC未定义局部变量或方法“响应”

时间:2015-11-11 06:36:30

标签: ruby-on-rails ruby rspec

我在...的响应中收到错误

规格/特征/ test_name_spec.rb

require "spec_helper"

describe "the signin process", :type => :feature do
  it "does not sign me in if I use the wrong password" do
    visit '/users/sign_in'
    within("#new_user") do
      user = Fabricate(:user, email: 'user@example.com', password: 'password')
      fill_in 'Email', :with => 'user@ example.com'
      fill_in 'Password', :with => 'badone'
    end
    click_button 'Log in'
    expect(response).to render_template(:new)
  end
end

gemfile

group :test do
  gem 'shoulda-matchers', '~> 2.8', require: false # now loaded inside of spec/spec_helper.rb
  gem 'capybara', '~>2.4'
  gem 'launchy'
  gem 'capybara-email', github: "dockyard/capybara-email"
  gem 'database_cleaner', '~> 1.5', '>= 1.5.1'
end

我感到很困惑,因为上面的测试成功使用expect,而page

expect(page).to have_content 'Signed in successfully.'

这可能会发生什么?

修改

我已将其更改为...

expect(page).to have_content 'Log in'

这基本上是一回事,但我仍然想知道为什么response犯了错误。它是不是在Capybara中可用,还是有另一个问题为什么那不起作用?

2 个答案:

答案 0 :(得分:7)

您正在撰写feature spec。使用功能规范,没有响应对象。根据设计,使用功能规范,您不会使用低级别的问题进行测试,例如呈现的模板,但是更高级别的问题,例如页面上的预期内容。

您可能对映射到rails的集成测试的request specs感兴趣,因此允许跨多个请求的规范,但会公开响应方法。

但是你不能(或者至少不应该)在请求规范中使用水豚(invisit等) - 对混合集成的问题已经失去了很多时间测试语言(click_buttongetpost)和水豚。这两者存在于完全独立的世界中,例如由水豚触发的请求对response没有影响,response触发的请求对get没有影响。

答案 1 :(得分:1)

expect阻止之外的it。这将导致各种各样的乱七八糟。

所有断言(和测试设置代码)都应嵌套在itbeforeafter块中。