构建一个基本的rails应用程序我正在重新考虑将外部码头工人/计算机作为一项服务进行繁重的吊装,即iron.io。"工人">
在重构中创建了Grape API,以允许远程"工作者"的处理状态在处理完成时通知服务器。然后,用户界面使用ajax轮询本地服务器以进行更新。API和基本测试都可以。它也可以在开发中使用Delayed::job来运行工作者。
然而,我似乎无法让我的水豚测试端到端地工作,因为延迟的::作业运行过程向服务器发出HTTP请求总是被拒绝连接。
如果我将rails服务器与测试并行运行:(RAILS_ENV="test" rails s -p 3001
(,然后确保ENV变量设置为端口3001,那么它可以正常工作。
我试过
- Capybara.config的各种组合(如下所示(
- 在测试中:访问url(其中
url="http://#{Capybara.server_host}:#{Capybara.server_port}"
(,看看这是否会"启动"服务器 - 各种网络驱动程序(恶作剧、硒等(
任何想法、经验或指导都非常感谢
Ben
注意:在代码中
- 填充域&端口通过已填充的ENV["]变量(这些环境变量将在运行环境iron.io中设置(
- 端口&app_host设置如下
-
测试中填充的ENV变量
Capybara.configure do |config| config.run_server = true config.server_port = "9876" config.app_host = "http://127.0.0.1:9876" end
轨道4.1.0rspec 3.4.0水豚2.7.0恶作剧1.5.1硒2.53.0
我认为你的测试太多了。我建议您"模拟"与其他服务的交互,以使测试自给自足。在过去,我添加了一个test.js
,它是:
- 模拟页面上的ajax
- 检查是否已发出特定请求(
page.evaluate_script
( - 以您的外部服务方式回复他们(
execute_script
(
像这样:
# test.js
$.ajax = function(settings) {
window.__ajaxRequests || (window.__ajaxRequests = []);
window.__ajaxRequests.push(settings);
return {
done: function(cb) { settings.__done = cb; }
}
}
# spec/features/jobs_spec.rb
visit '/jobs'
click_button 'Start job'
requests = page.evaulate_script('window.__ajaxRequests')
expect(requests.size).to eq(1)
expect(requests[0].url).to eq('http://jobs.yourproduct.com/start')
...
expect(page).not_to have_content('Job completed')
page.execute_script('window.__ajaxRequests[0].__done({data:{status:"complete"}})')
expect(page).to have_content('Job completed')