我有一个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),并且我已尝试放弃帮助程序并且只是在程序上执行此操作。我认为关闭窗口是一个时间问题 - 我错过了一些明显的东西吗?
答案 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