我该如何测试这种特殊的方法



我有以下方法,负责请求URL并返回其Nokogiri::HTML文档。此方法检查是否定义了代理,如果定义了,它将调用带有或不带有代理选项的OpenURIopen

实施

require 'open-uri'
require 'nokogiri'
class MyClass 
  attr_accessor :proxy
  # ....
  def self.page_content(url)
    if MyClass.proxy
      proxy_uri = URI.parse(MyClass.proxy)
      Nokogiri::HTML(open(url, :proxy => proxy_uri)) # open provided by OpenURI
    else
      Nokogiri::HTML(open(url)) # open provided by OpenURI
    end
  end
end

我不知道我应该如何编写测试来证明以下内容:

  1. 当定义了代理时,OpenURI发出的请求实际上使用了代理信息
  2. 如果未定义代理,则会建立常规的非代理连接

以下是我为测试做的一个开始。

describe MyClass, :vcr do
  describe '.proxy' do
    it { should respond_to(:proxy) }
  end
  describe '.page_content' do
    let(:url) { "https://google.com/" }
    let(:page_content) { subject.page_content(url) }
    it 'returns a Nokogiri::HTML::Document' do
      page_content.should be_a(Nokogiri::HTML::Document)
    end
    # How do i test this method actually uses a proxy when it's set vs not set?
    context 'when using a proxy' do
      # ???
      xit 'should set open-uri proxy properties' do
      end
    end
    context 'when not using a proxy' do
      # ???
      xit 'should not set open-uri proxy properties' do
      end
    end
  end
end

首先,您需要安排proxy方法在一个测试用例中返回代理,而不是在另一个测试案例中。如果代理有一个"setter"方法,您可以使用它,否则您可以存根proxy方法。

然后,您至少需要在open上设置一个期望值,即它将在有或没有:proxy选项的情况下被调用,这取决于它是哪个测试。除此之外,您还可以选择是否存根并设置该方法中涉及的各种其他调用的期望值,包括URI.parseNokogiri::HTML

请参阅https://github.com/rspec/rspec-mocks获取有关建立测试替身和设定期望值的信息。如果要使用部分存根方法,请特别注意and_call_original选项。

更新:这里有一些代码可以让你开始。这适用于非代理方法。我把代理案件留给你了。还要注意,这使用了"部分存根"方法,在这种方法中,您最终仍然调用外部gem。

require 'spec_helper'
describe MyClass do
  describe '.proxy' do         # NOTE: This test succeeds because of attr_accessor, but you're calling a MyClass.proxy (a class method) within your page_content method
    it { should respond_to(:proxy) }
  end
  describe '.page_content' do
    let(:url) { "https://google.com/" }
    let(:page_content) { MyClass.page_content(url) } # NOTE: Changed to invoke class method
    context 'when not using a proxy' do
      before {allow(MyClass).to receive(:proxy).and_return(false)} # Stubbed for no-proxy case
      it 'returns a Nokogiri::HTML::Document' do
        page_content.should be_a(Nokogiri::HTML::Document)
      end
      it 'should not set open-uri proxy properties' do
        expect(MyClass).to receive(:open).with(url).and_call_original  # Stubbing open is tricky, see note afterwards
        page_content
      end
    end
        # How do i test this method actually uses a proxy when it's set vs not set?
    context 'when using a proxy' do
      # ???
      xit 'should set open-uri proxy properties' do
      end
    end
  end
end

open的Stubbing很棘手。请参阅如何rspec mock打开uri?以获得解释。

相关内容

  • 没有找到相关文章