视图中的实例变量在Capybara测试中保持为空

时间:2013-01-16 15:53:45

标签: ruby-on-rails rspec capybara bdd

我有一个页面,当我真正使用它时会渲染很多东西,但在Capybara中没有呈现任何内容。

控制器是这样的:

class IdeasController < ApplicationController
  def index
    @ideas = Idea.all
  end

页面的相关位如下:

<div class="accordion" id="accordion">
  Ideas length is <%= @ideas.length %>.
  <% @ideas.each do |idea| %>
    <div class="accordion-group">
      <div class="accordion-heading">
        <%= link_to(idea.title, '#idea_' + idea.id.to_s, class: "accordion-toggle", data: {toggle: "collapse", parent: "#accordion"}  ) %>
      </div>
      <%= div_for(idea, class: "accordion-body collapse") do %>
          <div class="accordion-inner">
            <%= render :partial => "idea", locals: { :idea => idea } %>
          </div>
      <% end %>
    </div>
  <% end %>
</div>

在开发中查看时,这可以很好地工作,我在视图中获得大量内容(我的数据库中充满了模拟数据)。但是当我使用save_and_open_page在测试中打开它时,它完全是空的,并且说“Ideas length is 0”。

我做了rake db:test:clonerake db:test:prepare,但是nada - 保持空白。

你可以帮我找出原因吗?有没有办法窥探测试数据库并查看是否存在任何内容?

编辑:受到评论的启发,我意识到问题必须是测试环境每次都会冲出来,所以很明显没什么。在(显然是误入歧途的)尝试解决这个问题时,我做了:

  before do
    create(:idea)
    visit root_path
    click_link "Log In"
  end

注意create(:idea)行,它应该触发我的Idea工厂并将一个模拟想法粘贴到数据库中(工厂可以在其他测试中正常工作)。

现在页面上写着:

内部服务器错误

SQLite3 :: BusyException:数据库被锁定:INSERT INTO“users”(“created_at”,“email”,“name”,“provider”,“uid”,“updated_at”)VALUES(?,?,?, ?,?,?)

这超出了奇怪的范围。 Rails s正在后台运行。

根据评论者的要求,完整的规范如下:

require 'spec_helper'

describe "Idea page", js: true do

  subject { page }

  before do
    create(:idea)
    visit root_path
    click_link "Log In"
  end

  context "Single idea" do
    before do
      save_and_open_page
        #click_link('Eligendi sint quod quia alias sed sit vitae repellendus.')
    end

    it { should have_selector('a',text:'Claim') }

  end


end

1 个答案:

答案 0 :(得分:1)

使用工厂创建数据是正确的方法。要修复sqlite错误,可能需要增加数据库的超时。

要在config/database.yml

中执行此操作

找到test:环境并设置

timeout:

更大的价值。根据问题SQLite3::BusyException

的建议

之后,确保在spec/spec_helper.rb中您有以下行:

  config.use_transactional_fixtures = false

并且您正在使用像database_cleaner这样的东西来保持测试数据库在测试之间保持清洁。