Тест Rails с участием объекта, который требует обновления API - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь заставить объект Билла выполнять тесты. Это законопроект конгресса США, который у меня есть в xml через rsync в каталоге данных. Мой код берет название счета, скажем, «h1.xml», анализирует xml и затем получает полный текст счета от www.govtrack.us. Итак, в моем основном приложении, чтобы создать счет

  • Получить имя счета (например, h1) (с помощью перетаскивания в методе def self.update_from_directory)
  def self.update_from_directory
    Dir.glob("#{Rails.root}/data/bills/small_set/*.xml").each do |bill_path|
      bill_name = bill_path.match(/.*\/(.*).xml$/)[1]
      b = Bill.find_or_create_by(:govtrack_name => bill_name)
      b.update_bill
      b.save!
    end
  end
  • Обновить счет
def update_bill
    file_data = File.new("#{Rails.root}/data/bills/#{self.govtrack_name}.xml", 'r')
    bill = Feedzirra::Parser::GovTrackBill.parse(file_data)
    if bill && (self.introduced_date.nil? || (bill.introduced_date.to_date > self.introduced_date))

      self.congress = bill.congress
      self.bill_type = bill.bill_type
      self.bill_number = bill.bill_number
      ... and so on . . . until:
      get_bill_text 
  • Обновить запись счета с текстом счета
  def get_bill_text
      bill_object = HTTParty.get("#{GOVTRACK_URL}data/us/bills.text/#{self.congress.to_s}/#{self.bill_type}/#{self.bill_type + self.bill_number.to_s}.html")
      self.bill_html = bill_object.response.body
      self.text_updated_on = Date.today
      Rails.logger.info "Updated Bill Text for #{self.ident}"
  end

Моя цель очень проста, я хочу высказать весь счет за тест:

    def setup
       @my_test_bill = Bill.new(:govtrack_id => "h1")
       @my_test_bill.update_bill
    end

Я пытаюсь заставить работать webmock и vcr, но все примеры, которые я могу найти, предоставляют способ смоделировать конкретный вызов, и я не хочу перепечатывать совершенно новый метод update_bill.

Любые мысли с благодарностью.

Тим

1 Ответ

1 голос
/ 03 августа 2011

Подумайте об изменении метода update_bill на:

def update_bill
  file_data = File.new("#{Rails.root}/data/bills/#{self.govtrack_name}.xml", 'r')
  bill = Feedzirra::Parser::GovTrackBill.parse(file_data)
  if bill && (self.introduced_date.nil? || (bill.introduced_date.to_date > self.introduced_date))

  self.congress = bill.congress
  self.bill_type = bill.bill_type
  self.bill_number = bill.bill_number

  # Yield to a block that can perform arbitrary calls on this bill
  if block_given?
    yield(self)
  end

  # Fill bill text if empty
  if bill_html.blank? && text_updated_on.blank?
    get_bill_text
  end
end

Затем измените ваш метод настройки на:

def setup
   @my_test_bill = Bill.new(:govtrack_id => "h1")
   @my_test_bill.update_bill do |bill|
     bill.text_updated_on = Date.today
     bill.bill_html = "The mock bill contents"
   end
end

Это может быть не совсем решением, но такой подход - передача получателя обратно в блок, переданный методу, позволяет изменить точное поведение данного метода во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...