Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby Mechanize时的存根测试_Ruby_Screen Scraping_Mechanize - Fatal编程技术网

使用Ruby Mechanize时的存根测试

使用Ruby Mechanize时的存根测试,ruby,screen-scraping,mechanize,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_

我一直在尝试使用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::页面,其中包含解析的html以及所有好的内容。如果有人知道一种获取该对象并对其进行序列化的方法,我会很高兴(但是,由于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::页面

有谁能指导我更好地测试像lookup_课程这样的方法,它使用了很多功能。也许我应该打破代码中的逻辑,使之更好(如果是这样,你会怎么建议?)

谢谢你抽出时间


Michael

你可以看看这个,它建议使用。另一个值得一看的是。

你可以看看这个,它建议使用。另一个值得一看的是。

我曾经用来避免机械化本身的混乱的一个解决方案是围绕使用机械化设计一个更轻薄的界面。。。我已经创建了自己的get和post方法来包装Mechanize get/post,这样我就可以让我的代码尽可能地与Mechanize分离。仍然有兴趣看看是否有其他方法测试Ruby的Mechanize。。。谢谢你的观看。我曾经用过的一个解决方案是在使用Mechanize的周围设计一个更轻薄的界面来避免stubing Mechanize本身的混乱。。。我已经创建了自己的get和post方法来包装Mechanize get/post,这样我就可以让我的代码尽可能地与Mechanize分离。仍然有兴趣看看是否有其他方法测试Ruby的Mechanize。。。感谢您的观看。请注意:Webmock尚不支持Mechanzie。请注意:Webmock尚不支持Mechanzie。