2011-08-03 24 views
0

我想獲得一個Bill對象來執行測試。這是一個美國國會法案,我通過數據目錄中的rsync在xml中獲得。我的代碼採用賬單名稱,例如「h1.xml」,解析xml,然後從www.govtrack.us獲取賬單全文。所以,在我主要的應用程序,創造了一項法案Rails測試涉及一個對象,需要api更新

  • 獲取法案名稱(如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和錄像機的工作,但我可以找到的所有示例提供了一種方法來模擬特定的調用,並且我不想重新輸入一個全新的update_bill方法。

任何想法非常感謝。

回答

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 

這可能不完全的解決方案,但這種方法 - 將接收器傳遞迴給予方法的塊,允許您在運行時修改給定方法的確切行爲。