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

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

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

Вот небольшой пример, притворитесь, что цель моего кода состояла в том, чтобы осуществить ссылки домашней страницы 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 без всех издержек фактического доступа к Интернету?

спасибо - Джош

18
задан Joshua Cheek 28 January 2010 в 02:06
поделиться

3 ответа

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

36
ответ дан 30 November 2019 в 07:12
поделиться

Если вы пишете модульные тесты, вы смотрите на неправильный конец палки, вам не нужно, чтобы выпить 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'
2
ответ дан 30 November 2019 в 07:12
поделиться

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

Я рекомендую Webrick . Размещение HTTP-сервера - это щелчок.

1
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: