使用Ruby Mechanize时的Stubbing测试

时间:2010-05-18 23:15:15

标签: ruby screen-scraping mechanize

我一直在尝试使用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方法将返回一个带有html解析的Mechanize :: Page和所有好东西。我喜欢它,如果有人知道一种方法来获取该对象并执行类似于它的序列化(但是,由于Mechanize :: Page的一个子模块不知道如何从编组执行转储,序列化不起作用物体)。我一直在做的事情,显然是由于我对顽固的理解不足,是:

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

上面的代码是一个正在进行中的代码,因为当我这样做时,我意识到有一个更好的方法,希望你们中的一个聪明的人已经完成了这类事情。我不想要删除所有功能。理想情况下,我希望能够使用html创建一个Mechanize :: Page对象(因为我会知道这些页面上的html会是什么......我认为这将是一个很好的存根)。尽管如此,我无法弄清楚如何使用html实例化Mechanize :: Page。

有没有人可以指导我更好地测试像lookup_course这样使用大量功能的方法。也许我应该打破我的代码中的逻辑以使其更好(如果是这样,你会怎么建议?)

感谢您的时间,

迈克尔

1 个答案:

答案 0 :(得分:0)

您可以查看使用Stakoverflow questionsFakeweb建议。另一个值得一试的是Webmock