有没有办法在Ruby中测试网络爬虫?

问题描述 投票:0回答:1

我的这项工作要求我进行2次测试,我有这段代码要使用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```
ruby testunit
1个回答
0
投票

您的功能仅需要一条网络信息unparsed_page = HTTParty.get(url)。如果我们从获取页面中获取extract the parsing and saving of the page,则所有内容都可以通过常规方式进行测试。

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_pagesave_house_listings可以正常进行单元测试了。

注意,我已更改save_house_listings以将要写入的文件作为参数。这将使测试更容易,您可以告诉它写入临时文件,并且通常更灵活。

get_aspley_data现在是两个采用URL的经过单元测试的函数的瘦包装。它只需要集成测试。它还将要写入的文件作为参数,默认为$aspley_file。要测试它,请模拟HTTParty.get返回一个页面,并告诉它写入一个临时文件。

或者,您可以设置一个小型HTTP服务器进行测试。但是我发现将您的代码进行重构以进行单元测试,从而可以进行更简单的测试和更灵活的设计。

由于这是一项作业,您应该与老师核实他们希望您如何解决它。

© www.soinside.com 2019 - 2024. All rights reserved.