2016-05-23 405 views
0

我在我的models/images.rb模型中使用了此方法。我從測試開始,很難爲測試做好準備。希望你的幫助。RSpec測試模型方法

def self.tags 
    t = "db/data.csv" 
    @arr = [] 

    csvdata = CSV.read(t) 
    csvdata.shift 

    csvdata.each do |row| 
    row.each_with_index do |l, i| 
    unless l.nil? 
     @arr << l 
    end 
    end 
end 
@arr 
end 
+0

這個問題有點寬泛,請添加詳細信息以縮小答案集或隔離問題。例如,你的模型的解釋 –

回答

0

首先忠告 - CSV可能是最壞的想象數據格式,除非絕對不可避免的,最好避免 - 一樣,如果客戶堅持在MS Excel操作的數據是一個好主意(它不是) 。

如果您必須使用CSV,請不要使用像.tags這樣的方法名稱,這可能會導致常規的ActiveRecord關係混淆。

從文件系統讀取的測試方法可能相當困難。

首先,您可能需要更改方法的簽名,以便可以傳遞文件路徑。

def self.tags(file = "db/data.csv") 
    # ... 
end 

這樣,您可以傳遞一個夾具文件,以便您可以確定性地測試它。

RSpec.describe Image do 
    describe "tags" do 

    let(:file) { Rails.root.join('spec', 'support', 'fixtures', 'tags.csv') } 
    it 'returns an array' do 
     expect(Image.tags(file)).to eq [ { foo: 'bar' }, { foo: 'baz' } ] 
    end 
    end 
end 

但是你的方法是非常ideosyncratic -

def self.tags 
    t = "db/data.csv" 
    @arr = [] 

self.tags使得一個類的方法還您聲明@arr作爲實例方法。

此外,Ruby的enumerable模塊提供了很多操作數組的方法,因此不需要在循環中使用外部變量。

def self.tags(file = "db/data.csv") 
    csv_data = CSV.read(file) 
    csv_data.shift 
    csv_data.compact # removes nil elements 
end 
+0

非常感謝,是有道理的。你說CSV和Excel是最糟糕的數據格式。你會建議使用什麼? – Michael

+0

如果您真的想要在文件系統上存儲數據,JSON是一種非常優越的數據格式。否則,您希望將數據存儲在關係數據庫中,併爲用戶提供一個GUI來操作數據。除了初始導入到數據庫之外,我會避免使用CSV,因爲它沒有標準化,不能很好地處理UTF-8,而且很容易搞砸。 – max