1

これが私のコントローラーテストです:

 test "should get create" do
    sign_in(FactoryGirl.create(:user, admin: true))
    assert_difference('Event.count') do
      post :create, FactoryGirl.build(:event)
    end
    assert_not_nil assigns(:event)
    assert_response :success
  end

そして、events.rbに最も単純な検証を追加すると

class Event < ActiveRecord::Base
  attr_accessible :city, :date, :name, :state, :street
  has_many :periods

  validates :name, presence: true
end

私は得る:

1) Failure:
test_should_get_create(EventsControllerTest) [/Users/noahc/Dropbox/mavens/test/functional/events_controller_test.rb:37]:
"Event.count" didn't change by 1.
<2> expected but was
<1>.

しかし、それから私はevents_factory.rbを見ます

 factory :event do
    name 'First Event'
    street '123 street'
    city 'Chicago'
    state 'IL'
    date Date.today
  end

そして、名前が必要とされることに問題はないようです。

アップデート:

テストを行うとき:

test "should get create" do
    sign_in(FactoryGirl.create(:user, admin: true))

    assert_not_nil assigns(:event)
    assert_response :success
  end

私は得る:

 1) Failure:
test_should_get_create(EventsControllerTest) [/Users/noahc/Dropbox/mavens/test/functional/events_controller_test.rb:38]:
<nil> expected to not be nil.

その行を削除し、assert_response:successのままにすると、通過します。

アップデート2:

def create
    @event = Event.new(params[:event])
    @event.save
end
4

1 に答える 1

2

これを変更するのはどうですか:

post :create, FactoryGirl.build(:event)

に:

post :create, event: FactoryGirl.attributes_for(:event)

説明:

post作成しているレコードの属性を持つハッシュが必要です。FactoryGirl.build(:event)モデルの新しい保存されていないインスタンス ( event) を作成しますが、これは必要なものではありません。モデルに検証がなかったため、これはどういうわけか無視されていたため、実際にはファクトリは新しく作成されたイベントに影響を与えていませんでした (空の属性で作成されていたと思います)。

attributes_for対照的に、ファクトリの属性をハッシュとして返すため、次のようになります。

attributes_for(:event) #=> { name: 'First Event', street: '123 street', ... }

これはまさにあなたが望むものです。これを に渡すとpost、ハッシュの属性が に割り当てられ、paramsそれを使用して次の行に新しいイベントが作成されます: Event.new(params[:event])

于 2012-08-20T22:12:11.470 に答える