2016-10-04 2 views
1

Я написал API, который может вернуть последние 5 бюллетеней и его изображение, но я застрял в написании своего теста rspec.Rails Rspec test with carrierwave image

Прежде всего, вот связь между моделью.

Newsletter has_many NewsletterImages 
NewsletterImage belong_to Newsletter 

Во-вторых, я подумал, что мне нужно создать некоторые данные в тестовой базе данных, поэтому я написал следующий код в rspec файле.

7.times do |i| 
    n = Newsletter.create(title: "Test#{i}", content: "TestContents#{i}") 
    2.times do |i| 
    ni = NewsletterImage.create(newsletter_id: n.id, order: i) 
    ni.image = File.open('xxx.png') 
    ni.save 
    end 
end 

Итак, мне нужно загрузить файл в очень тесте? Есть ли лучший способ генерации данных и тестирования?

ответ

3

Лучше использовать Factory Girl, чтобы сделать свои тестовые данные. Таким образом, вы можете написать чистые тесты как

# /spec/factories/newsletter_factory.rb 
FactoryGirl.define do 
    factory :newsletter do 
    title "My newsletter" 
    content "Some content" 
    end 
end 

# /spec/factories/newsletter_image_factory.rb 
FactoryGirl.define do 
    factory :newsletter_image do 
    newsletter 
    image fixture_file_upload(Rails.root + 'spec/fixtures/images/example.jpg', "image/jpg") 
    end 
end 

# spec/models/newsletter_spec.rb 
image = create :newsletter_image 
expect(image.newsletter.title).to eq 'My Newsletter' 

со всеми деталями, как создаются модели скрыты в файлах определение фабрики, это то легко разделить код во многих тестах.

Более подробно о добавлении carrierwave файлов определений Factory Girl, искать другие ответы, такие как этот: https://stackoverflow.com/a/9952914/693349

+0

Спасибо, у меня есть какое-то направление. –

+0

BTW, это должно быть 'title 'Моя информационная рассылка' 'и' content' Некоторое содержимое «', удалите лишние ':'. –

+0

А, хорошо поймайте! Ред. Благодаря! –