在混入中模拟RestClient

时间:2018-09-17 18:55:45

标签: ruby rspec sinatra rspec3

我有一个使用RestClient的mixin:

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的使用情况。

我很难嘲笑RestClient。这种方法会产生错误(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 个答案:

答案 0 :(得分:1)

您可以使用Webmock Gem对请求进行存根并返回所需的正文/状态代码。

  • 将webmock gem添加到您的gem文件gem webmock
  • 将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