2016-11-01 3 views
0

몇 가지 방법을 시도해 보았습니다. 필자가 작성한 사용자 유닛 테스트의 다양한 순열이 왜 파일 유형 테스트에 실패했는지에 대해 명확하지 않습니다. 사용자 객체의 이미지 속성. 여기 Rails RSpec 유닛 테스트가 사용자 속성, 이미지 파일 유형에 실패합니다.

는 ... 내가 현재 가지고있는

모델/user.rb

class User < ApplicationRecord 
    mount_uploader :image, ImageUploader 
    validate :image_size_validation 
    validates_format_of :image, with: %r{\.(png|jpg|jpeg)\Z/}i, message: "image must be png, jpg, or jpeg", allow_nil: true 

    def image_size_validation 
    errors[:image] << "should be less than 5MB" if image.size > 5.megabytes 
    end 
end 

업 로더/image_uploader.rb의

class ImageUploader < CarrierWave::Uploader::Base 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

사양/모델/user_spec.rb

let(:user) { FactoryGirl.create(:user, username: "zoidberg", image: "image.png") } 

    it "has a valid image file" do 
    expect(user).to be_valid 
    expect(user.image).to be_valid 
    expect(FactoryGirl.build(:user, username: "Farnsworth", image: "image.jpg")).to be_valid 
    end 

수수께끼의 경우, username: <something>을 지정하지 않으면 테스트는 Username is invalid으로 실패합니다. 다른 모든 테스트에서 작동하고 공장에 내장되어 있음에도 불구하고.

사양 나는 또한 내가 일 것이라고 생각하지만 명확하지 않습니다이 it { should have_valid(:image).when('image.jpg', 'image.png', 'image.jpeg')}을 시도

FactoryGirl.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    sequence(:username) { |n| "#{n}#{Faker::Internet.user_name}#{Faker::Number.number(5)}#{Faker::Hipster.word}" } 
    sequence(:email) { |n| "#{n}#{Faker::Hipster.word}#{Faker::Number.number(5)}#{Faker::Internet.email}" } 
    phone Faker::Base.numerify('##########') 
    password Faker::Internet.password(6, 20) 
    state Faker::Address.state_abbr 
    city Faker::Address.city 
    image Faker::Avatar.image 
    sequence(:zip) { |n| "#{n}#{n}#{n}#{n}#{n}" } 
    seeking_coach true 
    accept_email true 
    accept_phone true 
    end 
end 

/공장/user.rb.

+0

'be_valid'는 객체의 속성이 아니라 객체에 사용되도록되어 있습니다. 개체의 이미지를 호출하면 문자열이 아닌 업 로더가 반환되기 때문에 형식 유효성 검사가 수행된다고 생각합니다. –

+0

개체 특성에 적합한 구문은 무엇입니까? –

+0

레일즈는'ActiveRecord :: RecordInvalid : Validation failed : 이미지 이미지는 png, jpg, jpeg 여야합니다 .' –

답변

0

"image.png"파일을 나타내는 문자열을 사용하여 carrierwave를 테스트 할 수 없습니다. 실제로 파일을 열고 업로드해야합니다.

File.open(path_to_file) { |f| user.image.store!(f) } 

여기서 path_to_file은 테스트 할 파일의 파일 이름을 포함하는 전체 경로를 나타냅니다.

it { should have_valid(:image).when('image.jpg', 'image.png', 'image.jpeg')} # won't work 

당신은 각 파일 형식을 확인하기 위해 별도의 테스트를 작성해야합니다 다음 했어야의 정규 중 하나가 작동하지 않는 이유

이다. -

또한

는 사용자 개체를 구축해야한다는이 단계에서 올바른 이미지가없는 것으로 만들 수 없습니다 : 당연히

let(:user) { FactoryGirl.build(:user, username: "zoidberg") } 

it 'with png file it should be valid' do 
    path_to_png_file = Rails.root + "spec/files/image.png" 
    File.open(path_to_png_file) { |f| user.image.store!(f) } 
    expect(user).to be_valid 
end 

it 'with txt file it should be invalid' do 
    path_to_txt_file = Rails.root + "spec/files/text.txt" 
    File.open(path_to_txt_file) { |f| user.image.store!(f) } 
    expect(user).to_not be_valid 
end 

, 당신은 당신의 테스트 환경 설정에 따라 경로를 필요 .

실제 이미지 자체를 테스트 할 필요가 없습니다. 유효성 검사를받은 사용자의 속성 일뿐입니다. 이미지가 유효하지 않은 경우 사용자는 유효하지 않지만 유효성 검증 오류를 테스트하여 원하는 경우 이미지와 관련되는지 확인할 수 있습니다.

+1

나는 너무 어리석지는 않지만 싫지만 이것을 구현하는 데 어려움을 겪고 있습니다. 레일즈에서'self.image.path'를 쿼리하면''uploads/Dr_John_Zoidberg.png ''와 같은 것을 얻을 것입니다. 그래서 나는 다른 순열 중에서'File.open ("uploads/# {user.image}")'및'File.open ("# {user.image.path}")'를 시도했지만, NameError : undefined 로컬 변수 또는 메소드 uploads '또는 Errno :: ENOENT : 해당 파일이나 디렉토리가 없습니다 @ rb_sysopen - uploads /'. –

+0

파일을 사용해야합니다.이 예에서 보여준 것처럼 시스템의 실제 파일에 대한 전체 경로로 열립니다. user.image ...를 설정하려고하지 마십시오. – David

관련 문제