Как мне проверить этот конкретный метод?

У меня есть следующий метод, который отвечает за запрос URL и возвращение его Nokogiri::HTML документ. Этот метод проверяет, определен ли прокси, и если он это сделает, он вызовет OpenURI"s open с или без параметров прокси.

Реализация

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

1 ответ

Решение

Прежде всего, вам необходимо организовать proxy способ вернуть прокси в одном тестовом случае, а не в другом. Если для прокси есть метод "setter", вы можете использовать его, иначе вы можете заглушить proxy метод.

Затем, как минимум, вы хотите установить ожидание на open что он будет вызываться с или без :proxy вариант, в зависимости от того, какой тест это. Помимо этого, у вас есть выбор: заглушить или установить ожидания для различных других вызовов, включенных в метод, включая URI.parse а также Nokogiri::HTML,

См. https://github.com/rspec/rspec-mocks для получения информации о том, как установить удвоение теста и установить ожидания. Обратите внимание, в частности, на and_call_original вариант, если вы хотите использовать частичную заглушку.

Обновление: вот код, с которого можно начать. Это работает для не-прокси-метода. Я оставил прокси дело для тебя. Также обратите внимание, что при этом используется подход "частичной заглушки", когда вы все равно в конечном итоге вызываете внешние гемы.

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 это сложно. Смотрите, как rspec mock open-uri? для объяснения.

Другие вопросы по тегам