gpt4 book ai didi

ruby-on-rails - 在使用 WebMock 时遇到问题,没有正确 stub

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:42 25 4
gpt4 key购买 nike

Ruby 1.9.3、RSpec 2.13.0、WebMock 1.17.4、Rails 3

我正在为公司应用程序编写测试。有问题的 Controller 显示客户调用的电话表,并允许排序/过滤选项。

编辑 测试失败,因为在我当前的设置中,路径没有呈现,因为 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 创建
  2. RecordingsController 获取 xml 文件,并将其解析为散列。
  3. 当您访问关联的路径时,您会看到散列的结果 -- 已发出的调用、它们的属性以及用于排序/筛选的参数的表格。

这是我目前的规范。

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

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

最佳答案

我是如何配置WebMock的

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

  1. 将 WebMock 添加到 group :test, :development 下的 Gemfile
    • bundle install 解决依赖问题
    • 我当前的设置包括 Ruby 1.9.3、Rails 2.13.0、WebMock 1.17.4
  2. 设置 spec_helper.rb 以禁用“真正的 HTTP 连接”。 (这是后来在这个令人费解的过程中收到的回溯错误。)据我所知,这允许所有“真实连接”转换为 localhost 连接并离线工作......这很棒,因为,理想情况下,我不希望外部应用程序的服务器同时运行。

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

  4. recordings_controller_spec.rb 中,我已经弄清楚了如何制作固定的 XML 响应。通过上述这些更改,我的规范能够正确地在外部辅助应用程序上 stub 响应,并使用此类响应正确呈现与正在测试的 Controller 关联的 View 。

    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

有帮助的建议/资源

关于ruby-on-rails - 在使用 WebMock 时遇到问题,没有正确 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27662386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com