【问题标题】:Instance variable in view stays empty in Capybara testCapybara 测试中视图中的实例变量保持为空
【发布时间】:2012-12-31 00:11:18
【问题描述】:

我有一个页面,当我真正使用它时,它会呈现很多东西,但在 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 打开它时,它完全是空的,并显示“想法长度为 0”。

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

你能帮我找出原因吗?有没有办法窥视测试数据库并查看是否有任何东西?

编辑: 受到 cmets 的启发,我意识到问题一定是测试环境每次都会刷新东西,所以显然什么都没有。在(显然是被误导的)尝试解决这个问题时,我做了:

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

注意create(: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

【问题讨论】:

  • 您是否在访问页面之前创建了 Idea 对象?在您的测试中,您只需执行p Idea.allp Idea.count 即可将该信息输出到您的控制台。如果您正在使用该 gem,您也可以使用 Pry。您可以运行rails c test 进入Rails 控制台以进行测试环境。
  • 你使用database_cleaner gem吗?
  • 在你的规范中做:puts Idea.all 看看你是否有任何想法。此外,如果您将规范代码添加到此问题中,这将有所帮助。
  • @MrDanA:我使用 Pry,感谢您的提示。 p Idea.count 确实是空的。我不介意尝试在测试中创建这个想法(尽管我宁愿它是一个夹具),但这也不起作用。
  • @dimuch:我愿意。好提示。我现在正在尝试在规范中创建一个想法,但它不起作用。

标签: ruby-on-rails rspec capybara bdd


【解决方案1】:

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

为此,请在config/database.yml

找到test:环境并设置

timeout:

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

的建议

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

  config.use_transactional_fixtures = false

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

【讨论】:

  • 我已经疯狂地提高了它 (500000) 但现在浏览器窗口只是在登录页面中旋转,“等待 127.0.0.1 ...”
  • 我会确保你有config.use_transactional_fixtures = false,如果你没有,试试看。如果这解决了您的问题,或者至少改变了它,请务必添加 database_cleaner gem 或类似的东西。
  • 我确实启用了 database_cleaner。我还需要transactional_fixtures 行吗?如果是这样,它会去哪里? (什么文件?)
  • spec/spec_helper.rb 是的,你需要它。问题可能是因为 capybara 运行在与您的 rails 环境不同的线程中,如果事务性固定装置在同一时间只有一个可以访问数据库。对于 MySQL,这表现为只有一个线程查看数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2014-02-01
  • 2014-02-22
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多