当我添加简单验证时,为什么我的测试开始失败?

时间:2012-08-20 20:33:05

标签: ruby-on-rails ruby-on-rails-3

这是我的控制器测试:

 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

1 个答案:

答案 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])