这是我的控制器测试:
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
答案 0 :(得分: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])
。