2016-05-23 124 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