【问题标题】:Test remote image url with carrierwave using rspec使用 rspec 使用载波测试远程图像 url
【发布时间】:2014-07-07 10:41:48
【问题描述】:

我想加快使用carrierwave gem 上传远程图片url 的规范测试。在我的模型中,我只允许通过远程 url 上传图像,而不是通过上传。为了测试模型,我使用带有 remote_image_url 字段和占位符图像的 FactoryGirl。

我的测试运行成功,但由于下载图像,每次测试都需要很长时间(大约 3-4 秒)。我知道我可以存根测试以避免这些外部 http 请求,但我不知道如何与工厂女孩一起做。有人可以帮忙吗?

型号:

class Store < ActiveRecord::Base
  mount_uploader :image, StoreUploader
  attr_accessible :name, :remote_image_url
  validates :remote_image_url, presence: true
end

工厂:

FactoryGirl.define do
  factory :store do
    name "Corner store"
    remote_image_url "http://placehold.it/800x600"
  end
end

RspecController:

describe Api::StoreController, type: :api do
  let!(:store) { create :store }

  before(:each) do
    get :show, id: store.id
  end

  it "returns a successful response" do
    expect(response).to be_success
  end

  it "each store has the correct fields" do
    expect(json).to match("name", "image")
  end
end

【问题讨论】:

    标签: ruby-on-rails rspec carrierwave factory-bot stub


    【解决方案1】:

    我认为您可以在您的保管箱中使用一些公共图像,但如果您想隔离测试并能够离线运行,那么您可以查看gem "webmock"

    其他选项在并行线程中启动机架网络应用程序并从那里提供图像。

    require 'sinatra/base'
    require 'webrick'
    
    module TestingPurposeServer
      def self.run!(port = nil)
        if port.nil?
          # ask system to pick free port for us
          server = TCPServer.new('127.0.0.1', 0)
          port = server.addr[1]
          server.close
        end
    
        thread = Thread.new do
          begin
            options = { :Port => port, :BindAddress => '127.0.0.1', :AccessLog => [], :Logger => WEBrick::Log.new("/dev/null"), :OutputBufferSize => 5 } #WEBrick::Log::new("/dev/null") }
    
            server = ::WEBrick::HTTPServer.new(options)
            server.mount "/", Rack::Handler::WEBrick, VtDirectServer::Server
            server.start
          rescue Exception => e
            puts e.message
            puts e.backtrace
          end
        end
    
        # wait for opening port
        while port_open?('127.0.0.1', port, 1)
          sleep 0.01
        end
        sleep 0.1
    
        port
      end
    
      def self.port_open?(ip, port, seconds = 1)
        Timeout::timeout(seconds) do
          begin
            TCPSocket.new(ip, port).close
            true
          rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
            false
          end
        end
      rescue Timeout::Error
        false
      end
    
      class Server < ::Sinatra::Base
        # your sinatra app there
      end
    end
    
    port = TestingPurposeServer.run!
    
    local_server_url = "http://127.0.0.1:#{port}/"
    

    【讨论】:

    • 感谢您对 webmock gem 的提示。这很棒,大大加快了我的测试速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多