ruby-on-rails - 涉及需要 api 更新的对象的 Rails 测试

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

我正在尝试获取 Bill 对象以对其执行测试。这是一份美国国会法案,我通过 rsync 在数据目录中将其保存在 xml 中。我的代码接受法案的名称,比如“h1.xml”,解析 xml,然后从 www.govtrack.us 获取法案的全文。所以,在我的主应用程序中,创建一个账单

  • 获取账单名称(例如 h1)(通过方法 def self.update_from_directory 中的 globbing)
  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 方法。

非常感谢任何想法。

蒂姆

最佳答案

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

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

关于ruby-on-rails - 涉及需要 api 更新的对象的 Rails 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925450/

相关文章:

ruby-on-rails - rails : Return a 401?

ruby-on-rails - Rvm 和 gems,bundle show 和 gem 列表

ruby-on-rails - 排列现有数组以播种 Rails 数据库

unit-testing - 单元测试自调用函数

c# - 测试除一个特定组合之外的所有参数组合

laravel - 如何测试 Laravel 资源

ruby-on-rails - 如何在 Rails 测试中结合使用 autotest 和 spork?

ruby - 在插件测试中模拟 Rails 3 路由和 Controller 的正确方法是什么?

testing - 从 Maven 项目创建可执行的 selenium 测试 jar

ruby-on-rails - 安装 rails 时出错 : ERROR: Failed to build gem native extension. Ubuntu 20.04