【问题标题】:Why session becomes empty hash in integration rspec?为什么会话在集成 rspec 中变成空哈希?
【发布时间】:2013-06-03 04:07:25
【问题描述】:

这是我们在 spec/features/ 下的集成测试用例。 rspec 的目的是先登录,然后打开用户菜单页面,并在使用菜单页面上测试链接。这是一个 Rails 3.2.12 应用程序。这是 rspec 代码:

describe "CheckLinks" do
  describe "GET /check_links" do
    before(:each) do

      ...data...

      visit '/'
      save_and_open_page      
      fill_in "login", :with => @u.login
      fill_in "password", :with => 'password'
      click_button 'Login'
      #save_and_open_page
    end
      
    it "works" do
      visit user_menus_path 
      save_and_open_page     
      click_link('Project')
      save_and_open_page
      page.body.should have_content('Project#') #('Project Number')
    end
  end
end

rspec 错误很简单:

  1) CheckLinks GET /check_links works
     ←[31mFailure/Error:←[0m ←[31mpage.body.should have_content('Project#') #('Project Number')←[0m
       ←[31mexpected to find text "Project#" in "Login Page"←[0m
←[36m     # ./spec/features/check_links_spec.rb:116:in `block (3 levels) in <top (required)>'←[0m

我们发现会话是empty hash 在click_link('project') 之后,它导致应用程序进入redirect_to signin 页面。但是在代码执行中,Project 链接页面确实将我们带到了项目的索引页面。为什么会话在click_link 之后在rspec 中变为empty hash。我们的 rspec 代码有问题吗?

【问题讨论】:

  • 你在 rspec-rails 和 capybara 上都使用什么版本号?
  • rspec-rails:2.13.1,水豚:2.1.0

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


【解决方案1】:

有几件事,首先我认为您的测试中不需要body。做吧

page.should have_content('Project#')

另外,请确保 ('Project#') 的评估结果是正确的。它试图从字面上匹配它。这可能是错误的,那是你的失败。

重要的是 Capybara DSL、page 和 visit 方法已移至功能规范。它在请求和控制器规格中不可用。查看文档的upgrading to capybara 2 部分。这可能是你的问题。您可以解决此问题,并将 Capybara DSL 包含在集成测试中,方法是将其包含在您的 spec_helper.rb

RSpec.configure do |c|
  c.include Capybara::DSL, :example_group => {
  :file_path => "spec/requests"
  }
end

但是您确实应该在功能规范中进行此类测试并遵循新约定。

【讨论】:

  • 帖子中的集成测试确实在 spec/features/ 下(从 rails g integration_test 默认的 spec/requests/ 移动)。规范/请求下没有任何内容
猜你喜欢
  • 2014-08-12
  • 2014-12-31
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多