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
Спасибо, должен ли я изменить свой код на вышесказанное? Это имеет смысл, я тоже могу заглушить .path? В приведенном выше коде требуется серьезный рефакторинг, поэтому вы хотите написать тест, а затем рефакторировать. – ismail
Обновленный ответ. –
Спасибо, хотя я думаю, что рельсы автоматически дают вам файл-объект. – ismail