Тесты на заглушки при использовании Ruby Mechanize - PullRequest
2 голосов
/ 19 мая 2010

Я пытался использовать Mocha для создания заглушек для тестов кода с использованием Mechanize. Вот пример метода:

  def lookup_course subject_area = nil, course = nil, quarter = nil, year = nil
    raise ArgumentError, "Subject Area can not be nil" if (subject_area.nil? || subject_area.empty?)
    page = get_page FIND_BASIC_COURSES
    raise ArgumentError, "Invalid Subject Area" unless page.body.include?(subject_area.upcase)
    form = page.form_with(:action => 'BasicFindCourses.aspx')
    if !quarter.nil? && !quarter.empty? && QUARTERS.has_key?(quarter.downcase) && year.is_a?(Integer)
      form['ctl00$pageContent$quarterDropDown'] = "#{Time.now.year}#{QUARTERS[quarter]}"
      puts form['ctl00$pageContent$quarterDropDown']
    end
    form['ctl00$pageContent$subjectAreaDropDown'] = subject_area
    form['ctl00$pageContent$courseNumberTextBox'] = course if (!course.nil? && !course.empty?)
    result = form.submit(form.button_with(:name => 'ctl00$pageContent$searchButton'))
    result.body.downcase.include?(subject_area.downcase) ? result : false
  end

Таким образом, метод get_page вернет Mechanize :: Page с html-разбором и всем прочим хорошим материалом. Я был бы рад, если бы кто-нибудь знал, как взять этот объект и выполнить что-то вроде его сериализации (однако, сериализация не сработала из-за того, что один из подмодулей Mechanize :: Page не понимает, как сделать дамп из Marshalling. предмет). То, что я должен был сделать, очевидно, из-за моего отсутствия понимания заглушки, это:

should "return a mechanize page with valid course subject" do
  Mechanize::Page.stubs(:body).returns(FIND_COURSE_HTML)
  Mechanize::Page.stubs(:form_with).returns(message = {})
  Mechanize::Form.stubs(:submit).returns(true)

  assert_equal Mechanize::Page,  @access.lookup_course("CMPSC").class
end

Приведенный выше код находится в стадии разработки, потому что, когда я делал это, я понял, что ДОЛЖЕН быть лучший способ, и, надеюсь, один из вас, умных парней, уже сделал этот тип вещи. Я не хочу заглушить каждую функциональность. В идеале я хотел бы иметь возможность создавать объект Mechanize :: Page с помощью html (так как я буду знать, что будет html на этих страницах ... и я думаю, это было бы хорошей заглушкой). Тем не менее, я не мог понять, как создать экземпляр Mechanize :: Page с помощью html.

Может ли кто-нибудь направить меня в лучшем направлении к тестированию такого метода, как lookup_course, который использует множество функциональных возможностей. Может быть, я должен разбить логику в моем коде, чтобы сделать это лучше (если так, как бы вы предложили?)

Спасибо за ваше время,

Michael

1 Ответ

0 голосов
/ 26 февраля 2011

Вы можете взглянуть на эти вопросы Stakoverflow , в которых предлагается использовать Fakeweb . Еще одна вещь, которую стоит проверить - это Webmock .

...