Как протестировать веб-браузер в Ruby - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть задание, которое требует от меня сделать два теста. У меня есть этот код, который я хочу провести модульное тестирование с использованием test-unit, но я понятия не имею, как это сделать.

Есть ли способ проверить, возвращаются ли данные в тестовой среде?

def get_aspley_data
  url = "https://www.domain.com.au/rent/aspley-qld-4034/?price=0-900"

  unparsed_page = HTTParty.get(url)
  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
  File.open($aspley_file, "ab") do |f|
    data = house_listings_data.map{ |d| d.to_csv(col_sep: "|") }.join
    f.write(data)
  end
end

1 Ответ

0 голосов
/ 06 апреля 2020

Для вашей функции требуется только один фрагмент сетевой информации, 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-сервер для тестирования. Но я считаю, что рефакторинг вашего кода для модульного тестирования приведет к более простым тестам и более гибкому дизайну.

Поскольку это задание, вы должны уточнить у своего учителя, как они хотят, чтобы вы его решили.

...