2010-01-28 7 views
17

Я написал небольшую программу, которая использует Mechanize для перемещения по сайту.Как протестировать рубиновое приложение, которое использует 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

ответ

35

Использование Fakeweb для заглушки из интернет-ответов.

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

Тогда ваш код

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 минут на то, чтобы понять это и подумал, что поделюсь решением.

+0

Спасибо, это сработало для меня. Вот решение, показывающее рабочий пример: http://github.com/JoshCheek/Play/tree/master/mocking-the-internet/ –

1

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

Я рекомендую WEBrick. Включение HTTP-сервера является быстрым.

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 или нет, потому что уже были опробованы в механизировать камень.

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

Edit:

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

sudo gem install mocha 

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

require 'rubygems' 
require 'mocha' 
+3

Честно говоря, я думаю, что это вопрос мнения. Stubbing Mechanize будет болезненным процессом по сравнению с чем-то вроде FakeWeb, учитывая сложность объектов результата. Вы, скорее всего, закончите очень хрупкими/высокими тестами технического обслуживания, которые сильно привязаны к точному исполнению, вытесняя его. Хотя я обычно соглашаюсь с тем, что вы не должны проверять внешние зависимости - я думаю, что это исключение из этого правила. –

Смежные вопросы