2

Railsは初めてで、TDDを実行せずにアプリを作成しましたが、今は戻ってすべてのテストに合格しようとしています。私はそれらのほとんどを通過しましたが、私が理解できない同じ問題に関連するいくつかが残っています。アプリも正しく機能します。これらのテストに合格できません。

テストは失敗し、これを提供します:

1) ProductsController POST create with valid params assigns a newly created product as @product
 Failure/Error: post :create, {:product => valid_attributes}, valid_session
 Paperclip::AdapterRegistry::NoHandlerError:
   No handler found for "#<File:0x007fc6d17b28f8>"
 # ./app/controllers/products_controller.rb:43:in `new'
 # ./app/controllers/products_controller.rb:43:in `create'
 # ./spec/controllers/products_controller_spec.rb:86:in `block (4 levels) in <top (required)>'

2) ProductsController POST create with valid params creates a new Product
 Failure/Error: post :create, {:product => valid_attributes}, valid_session
 Paperclip::AdapterRegistry::NoHandlerError:
   No handler found for "#<File:0x007fc6d1757cf0>"
 # ./app/controllers/products_controller.rb:43:in `new'
 # ./app/controllers/products_controller.rb:43:in `create'
 # ./spec/controllers/products_controller_spec.rb:81:in `block (5 levels) in <top (required)>'
 # ./spec/controllers/products_controller_spec.rb:80:in `block (4 levels) in <top (required)>'

3) ProductsController POST create with valid params redirects to the created product
 Failure/Error: post :create, {:product => valid_attributes}, valid_session
 Paperclip::AdapterRegistry::NoHandlerError:
   No handler found for "#<File:0x007fc6d36b3dd8>"
 # ./app/controllers/products_controller.rb:43:in `new'
 # ./app/controllers/products_controller.rb:43:in `create'
 # ./spec/controllers/products_controller_spec.rb:92:in `block (4 levels) in <top (required)>'

私のコントローラーの「create」メソッド:

def create
  @product = Product.new(params[:product])

  respond_to do |format|
    if @product.save
      format.html { redirect_to admin_path, notice: 'Product was successfully created.' }
      format.json { render json: @product, status: :created, location: @product }
    else
      format.html { render action: "new" }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end
end

私のモデル:

class Product < ActiveRecord::Base
  attr_accessible :designed, :features, :photo, :manufactured, :name, :case_study

  has_attached_file :photo, { 
    :styles => {
      :thumb => "x50>", 
      :small => "x150>", 
      :detail => "x600>"
    }
  }.merge(PAPERCLIP_STORAGE_OPTIONS)

  validates_attachment_presence :photo
  validates_attachment_size :photo, :less_than => 5.megabytes
  validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png']
end

私のテスト:

before(:each) do
  @image = File.new(Rails.root + 'spec/fixtures/images/test.png')
end 

def valid_attributes
  { "photo" => @image }
end

describe "POST create" do
describe "with valid params" do
  it "creates a new Product" do
    expect {
      post :create, {:product => valid_attributes}, valid_session
    }.to change(Product, :count).by(1)
  end

  it "assigns a newly created product as @product" do
    post :create, {:product => valid_attributes}, valid_session
    assigns(:product).should be_a(Product)
    assigns(:product).should be_persisted
  end

  it "redirects to the created product" do
    post :create, {:product => valid_attributes}, valid_session
    response.should redirect_to(admin_path)
  end
end
end
4

3 に答える 3

9

Rails 3.2を使用している場合は、テストではUploadedFileなくを送信してみてください。ファイル名と、初期化子のコンテンツタイプを受け取ります。FileUploadedFile

before(:each) do
  @image = Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/images/test.png'), 'image/png')
end

Rack::Test::Methodsテストまたはテストヘルパーに含める必要がある場合があります。

于 2013-03-11T15:41:08.000 に答える
1

次のようなショートカットとしてfixture_file_uploadを使用することもできます。Rack::Test::UploadedFile.new

post :create, product: { photo: fixture_file_upload('spec/fixtures/images/test.png', 'image/png') }
于 2013-09-10T13:00:53.413 に答える
0

データベースにペーパークリップの添付ファイルを追加しましたか?たとえば、移行を作成して実行しましたか?テストデータベースを含めますか?

于 2013-03-11T15:22:09.613 に答える