代码之家  ›  专栏  ›  技术社区  ›  craig

在mixin中模拟rest客户机

  •  0
  • craig  · 技术社区  · 6 年前

    RestClient :

    module Restable
      def get(url, options={})
    
          response = RestClient::Request.new(
            :method => :get,
            :url => url,
            :user => options[:user],
            :password => options[:password],
            :headers => { 
              :accept => :json,
              :content_type => :json
            }
          ).execute
        response
    
      end # /get
    end # /Restable
    

    我想用有效和无效的凭据测试mixin的用法。

    我很难嘲笑 . 这种方法会产生错误( warning: previous definition of RestClient was here

    require 'spec_helper'
    require File.expand_path('../../../lib/restable', __FILE__)
    Describe Restable do
    
      # create dummy object w/ mixin
      before(:each) do
        @test_obj = Object.new
        @test_obj.extend(Restable)
      end
    
      url = 'http://domain.tld/'
    
      context "get" do
    
        it "an anonymous GET request returns success" do
    
          RestClient = double
          client = double
          client.stub(:code) { 200 }
          RestClient.stub(:get) { client }
    
          response = @test_obj.get url
          expect(response.code).to eq(200)
        end
    
        it "a GET request returns success (200) when valid credentials are supplied to a protected resource" do
    
          RestClient = double
          client = double
          client.stub(:code) { 200 }
          RestClient.stub(:get) { client }
    
          url = 'http://domain.tld/private'
          options = {user: 'valid_user', password: 'valid_password'}
          response = @test_obj.get url, options
          expect(response.code).to eq(200)
        end
    
        it "a GET request returns FORBIDDEN (403) when invalid credentials are supplied to a protected resource" do
    
          RestClient = double
          client = double
          client.stub(:code) { 403 }
          RestClient.stub(:get) { client }
    
          url = 'http://domain.tld/private'      
          response = @test_obj.get url, {}
          expect(response.code).to eq(403)
        end
    
      end # /context
    end # /describe
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Macro    6 年前

    你可以用 Webmock Gem

    • 将webmock gem添加到gem文件 gem webmock
    • require 'webmock/rspec'
    require 'spec_helper'
    require File.expand_path('../../../lib/restable', __FILE__)
    Describe Restable do
    
      # create dummy object w/ mixin
      before(:each) do
        @test_obj = Object.new
        @test_obj.extend(Restable)
      end
    
      url = 'http://domain.tld/'
    
      context "get" do
    
        it "an anonymous GET request returns success" do
          WebMock.stub_request(:get, url).to_return(status: [200, 'OK'], body: { foo: 'bar' }.to_json)
          response = @test_obj.get url
          expect(response.code).to eq(200)
        end
    
        it "a GET request returns success (200) when valid credentials are supplied to a protected resource" do
          url = 'http://domain.tld/private'
          WebMock.stub_request(:get, url).with(basic_auth: ['valid_user', 'valid_pass']).to_return(status: [200, 'OK'], body: { foo: 'bar' }.to_json)
          options = {user: 'valid_user', password: 'valid_password'}
          response = @test_obj.get url, options
          expect(response.code).to eq(200)
        end
    
        it "a GET request returns FORBIDDEN (403) when invalid credentials are supplied to a protected resource" do
          url = 'http://domain.tld/private'
          WebMock.stub_request(:get, url).with(basic_auth: ['valid_user', 'invalid_pass']).to_return(status: [403, 'OK'], body: { foo: 'bar' }.to_json)      
          options = {user: 'valid_user', password: 'invalid_password'}
          response = @test_obj.get url, {}
          expect(response.code).to eq(403)
        end
    
      end # /context
    end # /describe