Подтвердить что ты не робот

Unit test в рельсах - модель с скрепкой

Я пытаюсь написать тест для модели с изображением, используя paperclip. Я использую стандартную платформу тестирования, не shoulda или rspec. В этом контексте, как мне его проверить? Должен ли я загрузить файл? Как добавить файл в прибор?

4b9b3361

Ответ 1

Добавление файла в модель мертво просто. Например:

@post = Post.new
@post.attachment = File.new("test/fixtures/sample_file.png")
# Replace attachment= with the name of your paperclip attachment

В этом случае вы должны поместить файл в каталог test/fixtures.

Я обычно делаю небольшой помощник в своем test_helper.rb

def sample_file(filename = "sample_file.png")
  File.new("test/fixtures/#{filename}")
end

Тогда

@post.attachment = sample_file("filename.txt")

Если вы используете что-то вроде Factory Girl вместо светильников, это становится еще проще.

Ответ 2

Это в Rspec, но может быть легко переключено

before do # setup
  @file = File.new(File.join(RAILS_ROOT, "/spec/fixtures/paperclip", "photo.jpg"), 'rb')
  @model = Model.create!(@valid_attributes.merge(:photo => @file))
end

it "should receive photo_file_name from :photo" do # def .... || should ....
  @model.photo_file_name.should == "photo.jpg"
  # assert_equal "photo.jpg", @model.photo_file_name
end

Так как Paperclip довольно хорошо протестирован, я обычно не уделяю слишком много внимания акту "загрузки", если только я не делаю что-то необычное. Но я постараюсь больше сосредоточиться на обеспечении того, чтобы конфигурации приложения в зависимости от модели, которой она принадлежит, отвечали моим потребностям.

it "should have an attachment :path of :rails_root/path/:basename.:extension" do
  Model.attachment_definitions[:photo][:path].should == ":rails_root/path/:basename.:extension"
  # assert_equal ":rails_root/path/:basename.:extension", Model.attachment_definitions[:photo][:path]
end

Все лакомства можно найти в Model.attachment_definitions.

Ответ 3

Я использую FactoryGirl, настраиваю модель.

#photos.rb
FactoryGirl.define do
  factory :photo do
    image File.new(File.join(Rails.root, 'spec', 'fixtures', 'files', 'testimg1.jpg'))
  description "testimg1 description"
  end # factory :photo
 end

затем

 # in spec

before(:each) { @user = FactoryGirl.create(:user, :with_photo) }

В приложении скрепки укажите, где он будет сохранен, т.е.

...
the_path= "/:user_id/:basename.:extension"
if Rails.env.test?
   the_path= ":rails_root/tmp/" + the_path
end
has_attached_file :image,  :default_url => ActionController::Base.helpers.asset_path('missing.png'),
:path => the_path, :url => ':s3_domain_url'

Paperclip.interpolates :user_id do |attachment, style|
   attachment.instance.user_id.to_s
end

...

затем проверьте оба определения attachment_definitions (как предложено kwon) и Dir.glob, чтобы проверить, что файл сохранен

 it "saves in path of user.id/filename" do
    expect(Dir.glob(File.join(Rails.root, 'tmp', @user.id.to_s, @user.photo.image.instance.image_file_name)).empty?).to be(false)
 end

таким образом, я уверен, что он выполняет правильное создание пути/пути и т.д.