1

これは、より高度なRails開発者にとっては単純な問題ですが、答えを特定することはできませんでした。合格していない非常に基本的なコントローラーの仕様が2つあります。関連付けられたビューはありませんが(を介して製品を追加/削除していますRailsAdmin)、コントローラーでは各アクションでリダイレクトしているため、これは問題にはなりません。

関連するコードを以下に添付します。ヘルプは大歓迎です。ありがとう!

products_controller_spec.rb には'spec_helper'が必要です

describe ProductsController do
   describe 'GET #new' do
it "creates a new product" do
  get :new
    response.should be_success
  end
end

describe 'POST #create' do
  it "creates a new product and saves it" do
    expect{
  post :create, product: FactoryGirl.attributes_for(:product)
  }.to change(Product, :count).by(1)
end
  end
end

controllers / products.rb

class ProductsController < ApplicationController

  def new
    @product = Product.new
    redirect_to 'home'
  end

  def create
   @product = Product.create(params[:product])
   redirect_to 'home'
   end
 end

エラーメッセージ:

Failures:

  1) ProductsController GET #new creates a new product
     Failure/Error: response.should be_success
       expected success? to return true, got false
     # ./spec/controllers/products_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

  2) ProductsController POST #create creates a new product and saves it
     Failure/Error: expect{
       count should have been changed by 1, but was changed by 0
     # ./spec/controllers/products_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

Finished in 0.07747 seconds
2 examples, 2 failures
4

2 に答える 2

4

本当に応答をレンダリングしたくない場合は、リダイレクトの代わりにこれを配置します。

head :ok

Product.createを使用する必要があります。

def create
  Product.create!(params[:product])
  head :ok
end

または、Product.createの戻り結果を確認してください

def create
  if Product.create(params[:product])
    head :ok
  else
    head :unprocessable_entity
  end
end

またはさらに良いことに、応答でエラーを返します

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

  if product.save
    head :ok
  else
    render json: product.errors
  end
end

現在のコードは製品の作成に失敗しており、createの呼び出しはfalseを返していますが、チェックしていません。create!を使用する 作成が失敗した場合はエラーがスローされます。それ以外の場合は、createの戻り値を確認し、戻り値のロジックがtrueまたはfalseであるかどうかを処理する必要があります。これを行わないと、最悪の種類の障害であるサイレント障害が発生します。

于 2013-03-16T00:40:19.967 に答える
2

最初のケースresponse.should be_successでは、のステータスコード200が返された場合にのみ合格します。あなたの場合、あなたはにリダイレクトしてhomeいるので、ステータスコードはの間にあり300 - 399ます。最初のテストを次のように変更します。

 response.should be_redirect

2番目のものについてはまだわかりません。

于 2013-03-15T18:49:35.140 に答える