我一直在尝试使用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这样使用大量功能的方法。也许我应该打破我的代码中的逻辑以使其更好(如果是这样,你会怎么建议?)
感谢您的时间,
迈克尔