ruby on rails -视图中的实例变量在Capybara测试中保持空



我有一个页面,当我真正使用它时,它渲染了很多东西,但在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>

当在开发中查看时,这工作得很漂亮,我在视图中获得了大量的东西(我的db充满了模拟数据)。但是当我在测试中使用save_and_open_page打开它时,它完全是空的,并显示"Ideas length是0"。

我做了rake db:test:clonerake db:test:prepare,但没有-保持空。

你能帮我找出原因吗?是否有一种方法可以窥视到测试数据库,看看是否有什么?

编辑:受评论的启发,我意识到麻烦一定是测试环境每次都会冲洗东西,所以显然什么都没有。为了解决这个问题(显然是错误的),我这样做了:

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

请注意create(:idea)行,它应该触发我的Idea工厂并将模拟Idea粘贴到db中(工厂与其他测试一起工作得很好)。

现在页面显示:

内部服务器错误

SQLite3::BusyException: database is locked: 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

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

config/database.yml

查找test:环境并设置

timeout:

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

的建议

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

  config.use_transactional_fixtures = false

并且您正在使用类似database_cleaner的东西来保持测试之间的测试数据库干净

最新更新