Я записал небольшую программу, которую использование Механизирует для пересечения сайта.
Я хочу к тестам записи на него, но не хочу, чтобы он на самом деле пошел, входят в систему сайт каждый раз, когда я запускаю тесты. Я хотел бы дразнить Интернет, так, чтобы, когда он переходит к некоторому сайту, он просто возвратил сохраненные результаты.
Вот небольшой пример, притворитесь, что цель моего кода состояла в том, чтобы осуществить ссылки домашней страницы 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 без всех издержек фактического доступа к Интернету?
спасибо - Джош
Используйте Fakeweb, чтобы вырезать ответы из Интернета.
В примере с Google сначала перейдите на веб-сайт и сохраните HTML-код нужной страницы. В этом случае предположим, что вы сохранили www.google.com через браузер или curl. Добавьте гем 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 обрабатывает ответ как Mechanize :: File вместо Mechanize :: Page. Вы можете проверить, что он полностью работает, запустив тесты на своем компьютере с отключенным сетевым подключением.
п.с. Я отвечаю на этот вопрос через 6 месяцев после того, как был задан вопрос, поскольку это лучший результат в Google, но он остался без ответа. Я просто потратил 30 минут на то, чтобы понять это сам, и подумал, что поделюсь решением.
Если вы пишете модульные тесты, вы смотрите на неправильный конец палки, вам не нужно, чтобы выпить Google.com, но вы должны издеваться / заглушить механизм объекта, то есть. Создан механизатор объекта, полученные метод вызывается на объекте с параметром http://www.google.com . И да, вам нужно проверить операцию, которую вы выполняете в результате, вы получаете, посещая страницу, которую вы можете легко сделать с помощью неподвижного ответа, а затем выполнять все тест. Например, если вы используете Mocha, то
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 или нет, потому что уже тестировали в механизировании GEM.
На другом примечании, если вы выполняете тесты интеграции / огурца, вы можете использовать Sinatra, чтобы подделать сайт. Sinatra позволяет легко написать сценарий одного страницы и запустить этот скрипт в качестве веб-сайта.
Редактировать:
Если вы не используете Mocha, вам нужно установить его и потребовать его в тестах
sudo gem install mocha
и в ваших тестах
require 'rubygems'
require 'mocha'
Если вы пишете функциональные тесты, и сервер не должен быть каким-либо фантазии, вы можете написать небольшой HTTP-сервер, который работает только для теста; Тестовый код настраивает, что необходимо связаться с MALLE HTTP-сервером на Localhost:.
Я рекомендую Webrick . Размещение HTTP-сервера - это щелчок.