【问题标题】:rails rspec capybara cannot get my internal api to connectrails rspec capybara 无法连接我的内部 api
【发布时间】:2016-07-15 05:22:30
【问题描述】:

构建一个基本的 Rails 应用程序我正在重构以在外部 docker/compute 作为服务(即 Iron.io)上进行繁重的工作。 “工人”

在重构中创建了 Grape API 以允许远程“工作人员”的处理状态在处理完成时通知服务器。然后用户界面使用 ajax 轮询本地服务器进行更新。 API 和基本测试一切正常。它还可以使用运行工作程序的 Delayed::job 在开发中工作。

然而,我似乎无法让我的 capybara 测试端到端地工作,因为延迟的::job 运行进程使 HTTP 请求返回服务器总是被拒绝连接。

如果我并行运行 Rails 服务器作为测试,它工作正常:(RAILS_ENV="test" rails s -p 3001),然后确保将 ENV 变量设置为端口 3001。

我试过了

  • Capybara.configure的各种组合(如下)
  • 在测试中:访问 url(其中 url="http://#{Capybara.server_host}:#{Capybara.server_port}" )以查看是否“启动”服务器
  • 各种网络驱动程序(poltergeist、selenium 等)

非常感谢任何想法、经验或指导

注意:在代码中

  • 通过填充的 ENV[''] 变量填充域和端口(这些环境变量将在运行环境 iron.io 中设置)
  • port & 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.0 rspec 3.4.0 水豚 2.7.0 闹鬼 1.5.1 硒 2.53.0

【问题讨论】:

    标签: ruby-on-rails api selenium rspec


    【解决方案1】:

    我认为你试图让你的测试太太多。我建议您“模拟”与其他服务的交互,以使测试自给自足。过去我添加了一个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')
    

    【讨论】:

    • 谢谢 Nort - 我明白你的意思,并且肯定会有一些“只是前端”的测试,但在我看来,完整的端到端集成测试可以确保端到端的客户体验有效应该是测试套件的一部分——你肯定不能只进行单元/组装测试吗?
    • @Ben 它是对您正在测试的应用程序内部所有组件的有效和端到端测试。必须从更高的角度编写集成多个系统的测试——也许是 API 测试(想到 runscope.com)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多