【问题标题】:Rails test involving an object that requires an api update涉及需要更新 api 的对象的 Rails 测试
【发布时间】:2011-08-03 11:03:03
【问题描述】:

我正在尝试获取一个 Bill 对象来执行测试。这是一项美国国会法案,我通过 rsync 在数据目录中的 xml 中拥有该法案。我的代码采用账单名称,例如“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 做 |bill_path| bill_name = bill_path.match(/.*\/(.*).xml$/)[1] b = Bill.find_or_create_by(:govtrack_name => bill_name) b.update_bill b.保存! 结尾 结尾
  • 更新账单
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 ... 等等 。 . .直到: 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 "更新了 #{self.ident} 的账单文本" 结尾

我的目标很简单,我想模拟整个账单进行测试:

默认设置 @my_test_bill = Bill.new(:govtrack_id => "h1") @my_test_bill.update_bill 结尾

我正在尝试让 webmock 和 vcr 工作,但我能找到的所有示例都提供了一种模拟特定调用的方法,我不想重新输入一个全新的 update_bill 方法。

任何想法都非常感谢。

提姆

【问题讨论】:

    标签: ruby-on-rails unit-testing testing mocking


    【解决方案1】:

    考虑将您的 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
    

    这可能不是完全正确的解决方案,但这种方法——将接收器传回给方法的块,允许您在运行时修改给定方法的确切行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2020-07-30
      相关资源
      最近更新 更多