Подтвердить что ты не робот

Как протестировать рубиновое приложение, использующее механизацию

Я написал небольшую программу, которая использует Mechanize для перемещения по сайту.

Я хочу написать тесты для него, но не хочу, чтобы он фактически заходил на сайт каждый раз, когда я запускал тесты. Я хотел бы издеваться над Интернетом, так что, когда он перейдет на какой-либо сайт, он просто возвращает сохраненные результаты.

Вот небольшой пример, притвориться, что моя цель кода заключалась в том, чтобы вытащить ссылки с главной страницы google, поэтому я пишу тест, чтобы убедиться, что первая ссылка, найденная моим кодом, имеет текст "Изображения". Я мог бы написать что-то вроде этого:

require 'rubygems'
require 'mechanize'
require 'test/unit'

def my_code_to_find_links
  google = WWW::Mechanize.new.get('http://www.google.com')
  # ...
  # some code to figure out which liks it wants
  # ...
  google.links
end

class TestGoogle < Test::Unit::TestCase
  def test_first_link_is_images
    assert_equal 'Images' , my_code_to_find_links.first.text
  end
end

Как мне высмеять google.com, чтобы я мог тестировать my_code_to_find_links без всех накладных расходов на фактический доступ в Интернет?

спасибо -Josh

4b9b3361

Ответ 1

Используйте Fakeweb для отключения ответов в Интернете.

Для примера Google сначала зайдите на сайт и сохраните html желаемой страницы. В этом случае позвольте предположить, что вы сохранили www.google.com через свой браузер или завиток. Добавьте камень Fakeweb в файл test.rb

Тогда ваш код

stream = File.read("saved_google_page.html")
FakeWeb.register_uri(:get, 
    "http://www.google.com", 
    :body => stream, 
    :content_type => "text/html")

Когда вы выполняете стандартный вызов Mechanize

agent = Mechanize.New
page = agent.get("http://www.google.com/")

Fakeweb вернет страницу, которую вы сохранили, с заголовками content_type, установленными таким образом, что Mechanize будет считать, что он успешно обратился к Интернету. Убедитесь, что заголовок content_type установлен, так как иначе Механизм обрабатывает ответ как Mechanize:: File вместо Mechanize:: Page. Вы можете проверить, что он полностью работает, выполнив тесты на вашем компьютере с отключенным сетевым подключением.

p.s. Я отвечаю на это через 6 месяцев после того, как был задан вопрос, так как это лучший результат в Google, но он не отвечает. Я просто потратил 30 минут на то, чтобы понять это и подумал, что я поделюсь решением.

Ответ 2

Если вы пишете блок-тесты, то вы смотрите на неправильный конец палки, вам не нужно издеваться над google.com, но вы должны издеваться/заглушить объект Mechanize, т.е. создается объект механизации, на объект вызывается метод get с параметром http://www.google.com. И да, вам нужно протестировать операцию, которую вы выполняете, на результат, который вы получаете, посетив страницу, которую вы можете легко сделать, заостренным ответом, а затем выполнив все тесты. Например, если вы используете мокко, то

mechanize = stub('WWW::Mechanize')
WWW::Mechanize.stubs(:new).returns(mechanize)
mechanize.stubs(:get).with('http://www.google.com').returns('What ever out put you are expecting so that you can test')

Я не думаю, что вам действительно нужно проверить, отправляется ли ваш запрос на google.com или нет, потому что это уже было проверено в Mechanize gem.

В другой заметке, если вы делаете тесты интеграции/огурца, вы можете использовать синатра для подделки сайта. Sinatra упрощает запись одной страницы script и запускает этот script как веб-сайт.

Edit:

Если вы не используете mocha, вам необходимо установить его и потребовать его в своих тестах

sudo gem install mocha

И в ваших тестах

require 'rubygems'
require 'mocha'

Ответ 3

Если вы пишете функциональные тесты, и сервер не должен быть чем-то интересным, вы можете написать небольшой HTTP-сервер, который работает только для теста; тестовый код настраивает код-под-тестом, чтобы связаться с небольшим HTTP-сервером на localhost:.

Я рекомендую WEBrick. Установка HTTP-сервера - это просто.