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 回答