遇到WebMock问题,而不是正确存根

时间:2014-12-26 21:58:35

标签: ruby-on-rails ruby rspec controller webmock

Ruby 1.9.3,RSpec 2.13.0,WebMock 1.17.4,Rails 3

我正在为公司应用编写测试。有问题的控制器显示客户拨打电话的表格,并允许排序/过滤选项。

编辑测试失败,因为使用我当前的设置,路径无法呈现,因为recorder_server未在本地运行,或者未正确设置。请帮助。

A Errno::ECONNREFUSED occurred in recordings#index:
Connection refused - connect(2)
/usr/local/lib/ruby/1.9.1/net/http.rb:763:in `initialize'

-------------------------------
Request:
-------------------------------
* URL       : http://www.recorder.example.com:8080/recorded_calls
* IP address: 127.0.0.1
* Parameters: {"controller"=>"recordings", "action"=>"index"}
* Rails root: /var/www/rails/<repository>
  1. 当发出呼叫时,其数据会加入xml文件,由外部API创建,名为 Recorder
  2. RecordingsController 获取xml文件,并将其解析为哈希。
  3. 当您访问相关路径时,您会看到哈希的结果 - 已放置的调用表,它们的属性以及排序/过滤器的参数。
  4. 到目前为止,这是我的规格。

    require 'spec_helper'
    include Helpers
    
    feature 'Exercise recordings controller' do
      include_context "shared admin context"
    
      background do
        canned_xml = File.open("spec/support/assets/canned_response.xml").read
        stub_request(:post, "http://recorder.example.com:8080/recorder/index").
          with(body: {"durations"=>["1"], "durations_greater_less"=>["gt"], "filter_from_day"=>"29", "filter_from_hour"=>"0", "filter_from_minute"=>"0", "filter_from_month"=>"12", "filter_from_year"=>"2014", "filter_prefix"=>true, "filter_to_day"=>"29", "filter_to_hour"=>"23", "filter_to_minute"=>"59", "filter_to_month"=>"12", "filter_to_year"=>"2014"}, # "shared_session_id"=>"19f9a08807cc70c1bf41885956695bde"},
               headers: {'Accept'=>'*/*', 'Content-Type'=>'application/x-www-form-urlencoded', 'User-Agent'=>'Ruby'}).
          to_return(status: 200, body: canned_xml, headers: {})
        uri = URI.parse("http://recorder.example.com:8080/recorder/index")
        visit recorded_calls_path
      end
    
      scenario 'show index page with 1 xml result' do
        #page.save_and_open_page
        expect(title).to eq("Recorded Calls")
      end
    end
    

    这是RecordingsController

    class RecordingsController < ApplicationController
      # before_filter options
      def index
        test_session_id = request.session_options[:id]
        #Make request to recording app for xml of files
        uri = URI.parse("http://#{Rails.application.config.recorder_server}:#{Rails.application.config.recorder_server_port}/recorder/index")
        http = Net::HTTP.new(uri.host, uri.port)
        xml_request = Net::HTTP::Post.new(uri.request_uri)
        xml_request_data = Hash.new
        # sorting params
        xml_request_data[:shared_session_id] = request.session_options[:id]
        xml_request.set_form_data(xml_request_data)
        response = http.request(xml_request)
        if response.class == Net::HTTPOK
          @recordings_xml = XmlSimple.xml_in(response.body)
          @recordings_sorted = @recordings_xml["Recording"].sort { |a,b| Time.parse("#{a["date"]} #{a["time"]}") <=> Time.parse("#{b["date"]} #{b["time"]}") } unless @recordings_xml["Recording"].nil?
        else @recordings_xml = Hash.new
        end
      end
      # other defs
    end
    

    非常感谢任何和所有建议。谢谢。

2 个答案:

答案 0 :(得分:8)

我如何配置WebMock

我在B-Seven的帮助下回答了我自己的问题以及一系列评论。逐个文件,我将列出为正确使用WebMock所做的更改。

  1. 将{Web站点添加到Gemfile下的group :test, :development
    • bundle install解决依赖关系
    • 我当前的设置包括Ruby 1.9.3,Rails 2.13.0,WebMock 1.17.4
  2. 设置spec_helper.rb以禁用“Real HTTP连接”。 (这是在这个令人费解的过程中稍后收到的回溯错误。)根据我的理解,这允许将所有“真实连接”转换为localhost连接并脱机工作......从理想情况来说,这是非常好的不希望外部应用程序的服务器同时运行。

    require 'webmock/rspec'
    WebMock.disable_net_connect!(allow_localhost: true)
    
  3. 在我的test.rb环境文件中,recorder_serverport的配置已被注释掉...如果未注释,控制器将引发一个说明未初始化常量的异常。我使用测试服务器/端口(用example的公司名称替换​​)作为规范存根的布局。

  4. recordings_controller_spec.rb中,我已经想出了如何制作一个固定的XML响应。通过上述这些更改,我的规范能够在外部辅助应用程序上正确存根响应,并使用此类响应正确呈现与正在测试的控制器关联的视图。

    require 'spec_helper'
    include Helpers
    
    feature "Exercise recordings_controller" do
      include_context "shared admin context"
    
      # A background is currently not used, because I have 3 scenario types... No xml
      # results, 1 result, and 2 results. I will later DRY this out with a background,
      # but the heavy lifting is over, for now.
    
      scenario "show index page with 1 xml result" do
        canned_xml_1 = File.open("spec/support/assets/canned_response_1.xml").read
        stub_request(:post, "http://recorder.example.com:8080/recorder/index").
          with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
          to_return(status: 200, body: canned_xml_1, headers: {})
        uri = URI.parse("http://recorder.example.com:8080/recorder/index")
        visit recorded_calls_path
        title.should == "Recorded Calls"
        page.should have_content("Search Results")
        page.should have_content("Inbound", "5551230000", "175", "December 24 2014", "12:36:24", "134")
      end
    
    end
    
  5. 帮助

    的建议/资源

答案 1 :(得分:1)

你为什么要捣毁localhost?我想你想

stub_request(:get, "http://#{Rails.application.config.recorder_server}:#{Rails.application.config.recorder_server_port}/recorder/index").