gpt4 book ai didi

ruby-on-rails - 是否可以在不修补 ActiveRecord 的情况下使用 Selenium/Capybara Webkit/Poltergeist?

转载 作者:行者123 更新时间:2023-12-04 05:58:04 25 4
gpt4 key购买 nike

根据 capybara Docs有两种单独的策略可以处理 Selenium 无法访问测试中生成的数据的问题:

  • 猴子补丁 ActiveRecord:

    类 ActiveRecord::Base
    @@shared_connection = nil
    定义自连接
    @@shared_connection ||检索连接
    结尾
    结尾
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
  • 使用截断而不是事务

  • 我已经按照 Avdi Grimm 的概述设置了 DatabaseCleaner here ,虽然查看我的日志我可以清楚地看到 DatabaseCleaner 正在使用截断,例如:

    (7.4ms) TRUNCATE TABLE "galeries", "photos", "users"RESTART IDENTITY CASCADE;

    ...当我运行我的功能时,我在设置过程中创建的任何模型都对驱动程序不可用。我可以看到场景中存在模型,但是如果我将它们打印到页面上,它们就不存在。

    我可以让驱动程序查看模型的唯一方法是使用上面的 ActiveRecord 猴子补丁,但这似乎调用了许多奇怪的次要问题 - 测试挂起等。

    为什么即使我使用带有截断策略的 DatabaseCleaner 驱动程序(Selenium 或 Capybara-Webkit)也看不到测试中创建的模型,以及如何让 Capybara 与 JavaScript 驱动程序一起工作?

    注意:使用默认驱动程序测试通过

    我的 DatabaseCleaner 配置:
    RSpec.configure do |config|

    # Clean DB completely
    config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    end

    # Set default strategy (non-js/Rack::Test)
    config.before(:each) do
    DatabaseCleaner.strategy = :transaction
    end

    # Set strategy for tests using JS (slower)
    config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
    end

    # Wrap DatabaseCleaner around each test (before & after)
    config.before(:each) do
    DatabaseCleaner.start
    end

    config.after(:each) do
    DatabaseCleaner.clean
    end

    end

    这是我想使用 JavaScript 测试的功能示例:
    feature "User deletes a photo" do

    before {
    as_signed_in_user
    @gallery = create(:gallery_with_photos)
    }

    scenario "successfully deletes a photo from a gallery", js: true do

    photo_title = @gallery.photos.first.title
    puts "GALLERY #{Gallery.find(1)}" # <Gallery:0x007f9b928fe8e8>
    visit gallery_path(@gallery) # JavaScript driver can't find gallery

    within '.photos-list' do
    click_link photo_title
    end
    click_link('Delete Photo')

    expect(current_path).to eq( gallery_path(@gallery) )
    expect(page).not_to have_link(photo_title)

    end

    end

    使用 JavaScript 驱动程序时,此测试失败并显示:
      1) User deletes a photo successfully deletes a photo from a gallery
    Failure/Error: Unable to find matching line from backtrace
    ActiveRecord::RecordNotFound:
    Couldn't find Gallery with 'id'=1

    正如 Dave Schweisguth 在评论中所建议的,我尝试移动 js:true在没有任何影响的情况下,针对功能而不是场景。

    最佳答案

    确保您使用的是最新版本的 database-cleaner、capybara、selenium-webdriver
    .还要确保所有这些 gem 都在测试组中并且是 require: false
    然后在您的 spec_helper.rb 文件中,您可以通过在这些 gem 之前要求 rails 来控制加载顺序。还要确保 RAILS_ENV 的正确设置和 use_transactional_fixtures
    spec_helper.rb

    require 'rubygems'

    ENV['RAILS_ENV'] ||= 'test'

    # Load rails + environment
    require File.expand_path('../../config/environment', __FILE__)
    require 'rspec/rails'

    # Load database cleaner
    require 'database_cleaner'

    # Load capybara and its dependencies
    require 'capybara/rspec'
    require 'capybara/rails'
    require 'selenium-webdriver'

    RSpec.configure do |config|
    # Do not use transactional, let database_cleaner do the work
    config.use_transactional_fixtures = false

    # Database cleaner config
    config.before(:suite) { DatabaseCleaner.clean_with :truncation }
    config.before(:each) { DatabaseCleaner.strategy = :transaction }
    config.before(:each, js: true) { DatabaseCleaner.strategy = :truncation }

    config.before(:each) { DatabaseCleaner.start }
    config.after(:each) { DatabaseCleaner.clean }
    end

    功能规范

    尝试使用 describe ... type: :feature相反,移动 js: true在上面,像这样:
    describe "User deletes a photo", type: :feature, js: :true do
    before { ... }
    scenario "successfully deletes a photo from a gallery" do
    ...
    end
    end

    您的代码

    1- 不要写 puts "GALLERY #{Gallery.find(1)}"即使是快速调试。在某些情况下,它可能会引发错误并导致困惑(即让您认为问题实际上并没有解决)。改用这个 puts "GALLERY #{Gallery.find(@gallery.id)}"
    2-在 rspec 中使用实例变量也不是一个好习惯,所以不要这样做:
    before {
    as_signed_in_user
    @gallery = create(:gallery_with_photos)
    }

    你应该写这个
    before { as_signed_in_user }
    let!(:gallery) { create(:gallery_with_photos) }

    请注意,我使用 let!砰的一声,相当于 before .因此,在规范的其余部分中,您必须替换 @gallery来自 gallery

    关于ruby-on-rails - 是否可以在不修补 ActiveRecord 的情况下使用 Selenium/Capybara Webkit/Poltergeist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24368880/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com