2014-12-06 58 views
1

我試圖通過查詢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 

回答

1

在我看來,你是在正確的軌道上磕碰上 - 模型/單元測試「應該」測試消息傳遞(而數據庫的交互是通過有效整合覆蓋/驗收測試)。

但是我認爲你的方法雖然不是太複雜,但是試圖做得太多,這會影響你編寫乾淨測試的能力。 (對我來說,代碼是說:「我在哪裏堅持這個存根?」,幾乎那種在那裏罵它!)

一個簡單的建議可能會提取一些方法,甚至類,因爲它似乎cassandra_fileraw_file?)有多個輸入/輸出或副作用,並且變得有點糾結。

它讓人想起來自SOLID名氣的單一責任原則(儘管有人說這是用Ruby中的方法描述的can't)。我看到有條件的查詢生成,數據庫(外部系統)調用和文件輸出。儘管這是一個相對較短的方法,但仍有很多事情要做!

目前的一所學校有模型處理這一切 - 這些都是PORO,「外包」到/ lib或其他地方,而讓ActiveRecord模型成爲模型。 (所以瘦身控制器/胖子模型被認爲是第一步,這可能是下一步。)

如果你有時間和傾向,我建議花更多時間研究這個主題,因爲有許多文章作爲以及Ruby討論會上的有趣演講。 (目前我真的從Sandi Metz中挖出任何東西)。

如果沒有,我會說你很接近,也許只是按照建議提取一些方法,並簡化模型,使測試更容易一點對你自己。

+0

感謝您的徹底迴應。我的目標是重構這些代碼,並按照你的說法進行操作,並將所有位提取到不同的方法中。然而,我想保證我不會退化功能,因此我想在試圖拆分別人的代碼之前先用測試覆蓋當前的代碼。有什麼建議嗎? – styger 2014-12-09 00:37:12

+0

一個想法是,如果您在重構之前需要保證,您可以編寫一個「啞」測試來驗證函數的正常輸出,而不會引入查詢存根的複雜性。 (換句話說,爲什麼要花費更多的時間,如果它會發生變化?)如果暫時放慢你的測試套件的多少並不重要。只是一個想法... – 2014-12-09 00:54:35