0

私は、ブラウザでうまく機能するcarrierwaveを実装しています。ただし、私のテストはこれを返し続けます:

エラー

  1) Item 
     Failure/Error: it { should be_valid }
       expected valid? to return true, got false
     # ./spec/models/item_spec.rb:36:in `block (2 levels) in <top (required)>'

factory.rb

include ActionDispatch::TestProcess

FactoryGirl.define do

  sequence(:email) { |n| "User#{n}@example.com"}

  factory :user do
    name     "John doe"
    email
    password "foobar"
    password_confirmation "foobar"
  end

  factory :list do
    name "Lorem ipsum"
    user
  end

  factory :item do
    image { fixture_file_upload(Rails.root.join('spec', 'support', 'test_images', 'google.png'), 'image/png') }
    title "Shirt"
    link "www.example.com"
    list
  end
end

item_spec.rb

require 'spec_helper'

describe Item do

  let(:user) { FactoryGirl.create(:user) }
    let(:list) { FactoryGirl.create(:list) }

  before do
    @item = list.items.build(title: "Lorem ipsum")
    @item.valid?
    puts @item.errors.full_messages.join("\n")
  end

  subject { @item }

  it { should respond_to(:title) }
  it { should respond_to(:list_id) }
  it { should respond_to(:list) }
  it { should respond_to(:image) }
  it { should respond_to(:remote_image_url) }
  its(:list) { should == list }

  it { should be_valid }

  describe "when list_id not present" do
    before { @item.list_id = nil }
    it { should_not be_valid }
  end

  describe "when image not present" do
    before { @item.image = "" }
    it { should_not be_valid }
  end

  describe "with blank title" do
    before { @item.title = " " }
    it { should_not be_valid }
  end

  describe "with title that is too long" do
    before { @item.title = "a" * 141 }
    it { should_not be_valid }
  end
end

item.rb

class Item < ActiveRecord::Base
  attr_accessible :link, :list_id, :title, :image, :remote_image_url
  belongs_to :list
  mount_uploader :image, ImageUploader

  validates :title, presence: true, length: { maximum: 140 }
  validates :list_id, presence: true
  validates_presence_of :image
end

spec/support/test_images フォルダーに google.png という画像があります。

私はレールに非常に慣れていないので、どんな助けも大歓迎です!

4

2 に答える 2

0

私はかなりばかげていると感じます。画像を添付するのを忘れたため、明らかに検証が失敗しました。

変更する必要がありました:

 before do
    @item = list.items.build(title: "Lorem ipsum")
    @item.valid?
    puts @item.errors.full_messages.join("\n")
 end

に:

  before do
    @item = list.items.build(title: "Lorem ipsum")
    @item.image = fixture_file_upload('/test_images/google.png', 'image/png')
  end
于 2013-01-07T13:29:44.637 に答える
0

it { should be_valid }

(ご想像のとおり)サブジェクトが有効でないため、失敗しています。なぜ無効なのかを調べる必要があります。次のようなことを試してください:

it "should be valid" do
  subject.valid?
  subject.errors.should be_empty
end

この例は失敗しますが、エラー メッセージはより説明的になります。

これにアプローチする別の方法は、プロジェクトにpryを追加することです。次に、コンソールを開く場所を追加binding.pryします。

it "should be valid" do
  subject.valid?
  binding.pry
  subject.errors.should be_empty
end

これで、テスト オブジェクトを検査して、検証がどのように失敗したかを把握できます。

于 2013-01-04T04:20:41.777 に答える