Я пытался использовать 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