我試圖通過查詢Cassandra數據庫來改進ActiveRecord模型的測試覆蓋率,該模型創建一個CSV文件。我們使用RSpec。我很難弄清楚如何測試下面顯示的cassandra_file
方法,因爲它調用了cdbh
(如下所示),它創建了與Cassandra數據庫的實時連接。使用RSpec測試依賴外部Cassandra調用的方法
我試圖做這樣的事情:
it 'copys from cassandra' do
cdbh = Cassandra.stub(:connect)
date = '2013/12/27'
expect(device).to receive(:save_csv).with(date, cdbh.execute(options))
device.raw_file(Date.new(2013,12,27))
end
但我得到這個錯誤:
Failures:
1) Device raw_file generic device copys from cassandra
Failure/Error: Unable to find matching line from backtrace
NoMethodError:
undefined method `stub' for Cassandra:Module
我看着處理磕碰API調用一些其他的問題,但大多數這些建議的寶石一樣VCR的或webmock看起來像他們沒有用於這個特定的用例,因爲我沒有試圖複製HTTP請求。有沒有更好的方法來測試這個?這是否是合理的測試,還是比它的價值更麻煩?
在此先感謝您的幫助!
型號方法:
def cassandra_file(date)
if customer.name.downcase == 'customer name'
q = 'SELECT * FROM readings WHERE device = ? and date in (?, ?, ?)'
return save_csv(
date,
cdbh.execute(q, guid, (date.to_date - 1).iso8601, date.to_date.iso8601, (date.to_date + 1).iso8601))
else
q = 'SELECT * FROM readings WHERE device = ? and date = ?'
return save_csv(
date,
cdbh.execute(q, guid, date.to_date.iso8601))
end
end
...
def cdbh
return unless ENV['CASSANDRA_HOSTS']
@cdbh ||= Cassandra.connect(hosts: ENV['CASSANDRA_HOSTS'].split(/,/)).connect('hurricane')
end
感謝您的徹底迴應。我的目標是重構這些代碼,並按照你的說法進行操作,並將所有位提取到不同的方法中。然而,我想保證我不會退化功能,因此我想在試圖拆分別人的代碼之前先用測試覆蓋當前的代碼。有什麼建議嗎? – styger 2014-12-09 00:37:12
一個想法是,如果您在重構之前需要保證,您可以編寫一個「啞」測試來驗證函數的正常輸出,而不會引入查詢存根的複雜性。 (換句話說,爲什麼要花費更多的時間,如果它會發生變化?)如果暫時放慢你的測試套件的多少並不重要。只是一個想法... – 2014-12-09 00:54:35