1

这是我们在 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链接页面确实将我们带到了项目的索引页面。为什么会话empty hashclick_link. 我们的 rspec 代码有问题吗?

4

1 回答 1

1

有几件事,首先我不相信你需要body在你的测试中。做就是了

page.should have_content('Project#')

此外,请确保('Project#')评估的任何内容都是正确的。它试图从字面上匹配它。这可能是错误的,那是你的失败。

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

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

但是你真的应该在特性规范中做这种测试并遵循新的约定。

于 2013-06-03T23:17:59.363 回答