2013-03-02 1 views
1

У меня есть модель, которая имеет метод to_csv и метод импорта, пытаясь проверить это в rspec, чтобы убедиться, что она делает правильную вещь, но имеет проблему. Я получаю следующее сообщение об ошибке:Неопределенный метод при запуске теста rspec с использованием заглушки

Failures: 

    1) Category Class import should create a new record if id does not exist 
    Failure/Error: Category.import("filename", product) 
    NoMethodError: 
     undefined method `path' for "filename":String 

Модель:

class Category 
    ...<snip> 

    def self.import(file, product) 
    product = Product.find(product) 
    CSV.foreach(file.path, headers: true, col_sep: ";") do |row| 
     row = row.to_hash 
     row["variations"] = row["variations"].split(",").map { |s| s.strip } 
     category = product.categories.find(row["id"]) || Category.new(row) 
     if category.new_record? 
     product.categories << category 
     else 
     category.update_attributes(row) 
     end 
    end 
    end 

    def self.to_csv(product, options = {}) 
    product = Product.find(product) 
    CSV.generate(col_sep: ";") do |csv| 
     csv << ['id','title','description','variations'] 
     product.categories.each do |category| 
     variations = category.variations.join(',') 
     csv << [category.id, category.title, category.description, variations] 
     end 
    end 
    end 
end 

Мой Тест:

describe Category do 

    describe 'Class' do 
    subject { Category } 

    it { should respond_to(:import) } 
    it { should respond_to(:to_csv) } 

    let(:data) { "id;title;description;variations\r1;a title;;abd" } 

    describe 'import' do 
     it "should create a new record if id does not exist" do 
     product = create(:product) 
     File.stub(:open).with("filename","rb") { StringIO.new(data) } 
     Category.import("filename", product) 
     end 
    end 
    end 
end 

ответ

3

Я бы просто сделать Category.import взять имя файла:

Category.import("filename", product) 

Тогда Category.import J усть передает это имя файла в CSV.foreach вызова:

CSV.foreach(filename, headers: true, col_sep: ";") do |row| 

Это тогда не нужно окурок File.open или какой-либо из этого джаз.

+0

Спасибо, должен ли я изменить свой код на вышесказанное? Это имеет смысл, я тоже могу заглушить .path? В приведенном выше коде требуется серьезный рефакторинг, поэтому вы хотите написать тест, а затем рефакторировать. – ismail

+0

Обновленный ответ. –

+0

Спасибо, хотя я думаю, что рельсы автоматически дают вам файл-объект. – ismail

 Смежные вопросы

  • Нет связанных вопросов^_^