Для вашей функции требуется только один фрагмент сетевой информации, unparsed_page = HTTParty.get(url)
. Если мы извлекаем разбор и сохранение страницы из выборки страницы, то все это становится тестируемым обычными средствами.
def parse_aspley_page(unparsed_page)
parsed_page = Nokogiri::HTML(unparsed_page)
house_listings_data = []
house_listings = parsed_page.css('.listing-result__details')
house_listings.each do |hl|
prop_type = hl.css('.listing-result__property-type')[0]
price = hl.css('.listing-result__price')[0]
suburb_address = hl.css('span[itemprop=streetAddress]')[0]
house_array = [house_listings]
house_array.push("#{prop_type} #{price}")
house_listings_data << [prop_type, price, suburb_address]
puts [prop_type, price, suburb_address].to_csv(col_sep: "|")
end
return house_listings_data
end
def save_house_listings(house_listings, file:)
File.open(file, "ab") do |f|
data = house_listings.map{ |d| d.to_csv(col_sep: "|") }.join
f.write(data)
end
end
def get_aspley_data(url, file: $aspley_file)
save_house_listings(
parse_aspley_page(HTTParty.get(url))
)
end
Теперь parse_aspley_page
и save_house_listings
можно тестировать модулем в обычном режиме .
Обратите внимание, что я изменил save_house_listings
, чтобы взять файл для записи в качестве параметра. Это упростит тестирование, вы можете указать его для записи во временный файл, и в целом будет более гибким.
get_aspley_data
теперь является тонкой оболочкой для двух функций, протестированных модулем, которые принимают URL. Нужно только интеграционное тестирование. Он также принимает файл для записи в качестве аргумента, по умолчанию $aspley_file
. Чтобы проверить это, нажмите HTTParty.get
, чтобы вернуть страницу, и попросите ее записать во временный файл.
В качестве альтернативы, вы можете настроить небольшой HTTP-сервер для тестирования. Но я считаю, что рефакторинг вашего кода для модульного тестирования приведет к более простым тестам и более гибкому дизайну.
Поскольку это задание, вы должны уточнить у своего учителя, как они хотят, чтобы вы его решили.