Не могу использовать проверяет наличие на Picture Rails 5.x - PullRequest
0 голосов
/ 16 апреля 2020

micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :tag1, presence: true, length: { maximum: 20 }
  validates :tag2, presence: true, length: { maximum: 20 }
  validates :tag3, presence: true, length: { maximum: 20 }
  validates :picture, presence: true
  validate  :picture_size
  validates :ispublic, inclusion: { in: [ true, false ] } 

  private

    # Validates the size of an uploaded picture.
   def picture_size
     if picture.size > 5.megabytes
       errors.add(:picture, "should be less than 5MB in size.")
     end
   end
end

microposts_controller.rb фрагмент:

def create
  @micropost = current_user.microposts.build(micropost_params)
  if @micropost.save!
    flash[:success] = "Post created!"
    redirect_to root_url
  else
    @feed_items = []
    render 'static_pages/home'
  end
end

def micropost_params
    params.require(:micropost).permit(:tag1, :tag2, :tag3, :picture, :ispublic)
end

Тест с ошибкой:

tag1 = "This"
tag2 = "Is"
tag3 = "Sparta"
image = File.open("test/fixtures/p_avatar.png")
assert_difference 'Micropost.count', 1 do
  post microposts_path, params: {micropost: { tag1: tag1, tag2: tag2, tag3: tag3, picture: "image", 
  ispublic: false }}
end

Ошибка теста:

Validation failed. Picture can't be blank.

Я использую CarrierWave ... на основе других ответов Мне было интересно, не могу ли я использовать проверку presence: true с изображением, но я думал, что @micropost.save просто хранить что угодно как строку (varchar). В целях тестирования я просто хочу убедиться, что передана правильная строка, но, возможно, в этом даже нет необходимости, если достаточно проверки CarrierWave и picture_size.

1 Ответ

0 голосов
/ 17 апреля 2020

Нашел это. В Rails spe c есть функция fixture_file_upload(), которая выполняет всю тяжелую работу по созданию объекта изображения для меня (какая-то загрузка в кеш, кажется) и созданию модели. Метод .save () проверяет его и сохраняет строку в БД.

Благодаря этому сайту он немного проинформировал меня о тестировании загрузки изображений без прохождения FactoryBot: https://jeffkreeftmeijer.com/carrierwave-rails-test-fixtures/

В конечном итоге я решил, что для микросообщений не требуется картинка (A la Twitter).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...