ActionCable,Capybara Webkit和Capybara Session#窗口的时间问题

时间:2017-04-29 01:57:42

标签: ruby-on-rails testing rspec functional-testing capybara-webkit

我有一个Rails 5应用程序,它使用ActionCable注册' guest'出场。当您访问该网站时,系统会提示您输入您的姓名。输入后,您的外观将广播给所有订阅者。当您退出窗口或“消失”时,您将看到已离开。它很棒;我遇到的问题是测试失踪 - 它只通过了大约一半的时间。

以下是相关测试:

RSpec.feature "Appearances", type: :feature, js: true do
  let(:picard) { 'Picard' }
  let(:riker) { 'Riker' }

scenario "A guest disappears" do
  create_guest picard
  new_window = within_new_incognito_window do
    visit '/'
    expect(page).to have_content picard
    create_guest riker
  end  
  new_window.close
  expect(page).to_not have_content riker
end

帮助者:

module GuestHelpers
  def within_new_incognito_window
    new_window = open_new_window
    within_window new_window do
      Capybara.current_session.driver.clear_cookies
      yield
    end
    new_window
  end

  def create_guest(name)
    within('#new_guest') do
      fill_in('guest[name]', with: name)
    end
    click_on("Go")
    expect(page).to have_content name
  end
end

我已经尝试将default_max_wait_time设置为100,我已经尝试在关闭窗口时插入睡眠(10),并且我已尝试放弃帮助程序并且只是在程序上执行此操作。我认为关闭窗口是一个时间问题 - 我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:0)

我通过将ActiveJob工作者的消失广播重构到AppearancesChannel来持续测试。我没有配置测试环境来使用ActiveJob!

答案 1 :(得分:0)

要使用需要ActiveJobs运行的RSpec测试功能,我发现以下内容非常有用 - 安装public void MoveTo(UserControl FoodX, double X, double Y) { Vector offset = VisualTreeHelper.GetOffset(FoodX); var top = offset.Y; TranslateTransform trans = new TranslateTransform(); FoodX.RenderTransform = trans; DoubleAnimation anim1 = new DoubleAnimation(0, 200, TimeSpan.FromSeconds(2)); trans.BeginAnimation(TranslateTransform.YProperty, anim1); //Added line trans.Changed += RecalculateCollision; } public void RecalculateCollision(object sender, EventArgs e) { Rect r1 = BoundsRelativeTo(MovingBox, Canvas); Rect r2 = BoundsRelativeTo(StaticBox, Canvas); if (r1.IntersectsWith(r2)) { MessageBox.Show("Collided"); } } public static Rect BoundsRelativeTo(FrameworkElement element, Visual relativeTo) { return element.TransformToVisual(relativeTo).TransformBounds(new Rect(element.RenderSize)); } ,在test.rb中设置rspec-activejob,然后将以下文件放在spec / support目录中< / p>

config.active_job.queue_adapter = :test

将配置您可以在每次测试中使用的不同元数据,以指定您是否希望在测试期间执行创建的活动作业。

require 'rspec/active_job'

RSpec.configure do |config|
  config.include(RSpec::ActiveJob)

  # clean out the queue after each spec
  config.after(:each) do
    ActiveJob::Base.queue_adapter.enqueued_jobs = []
    ActiveJob::Base.queue_adapter.performed_jobs = []
  end

  config.around :each, perform_enqueued: true do |example|
    @old_perform_enqueued_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
    example.run
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
  end

  config.around :each, peform_enququed_at: true do |example|
    @old_perform_enqueued_at_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
    example.run
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
  end
end