FactoryGirl和Rspec测试中attributes_for的含义

时间:2012-10-31 02:04:58

标签: ruby-on-rails ruby-on-rails-3 rspec attributes factory-bot

通过关于控制器测试的教程,作者给出了一个测试控制器动作的rspec测试示例。我的问题是,为什么他们使用attributes_for方法而不是build?除了返回值的哈希值之外,没有明确解释为什么使用attributes_for

it "redirects to the home page upon save" do
  post :create, contact: Factory.attributes_for(:contact)
  response.should redirect_to root_url
end

可以在此处找到教程链接:http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html该示例位于开头主题部分Controller testing basics

1 个答案:

答案 0 :(得分:59)

attributes_for将返回哈希值,而build将返回非持久对象。

鉴于以下工厂:

FactoryGirl.define do
  factory :user do
    name 'John Doe'
  end
end

以下是build的结果:

FactoryGirl.build :user
=> #<User id: nil, name: "John Doe", created_at: nil, updated_at: nil>

以及attributes_for

的结果
FactoryGirl.attributes_for :user
=> {:name=>"John Doe"}

我发现attributes_for对我的功能测试非常有帮助,因为我可以执行以下操作来创建用户:

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

使用build时,我们必须从user实例手动创建属性哈希值并将其传递给post方法,例如:

u = FactoryGirl.build :user
post :create, user: u.attributes # This is actually different as it includes all the attributes, in that case updated_at & created_at

我通常使用build&amp;当我直接想要对象而不是属性哈希时,create

如果您需要更多详细信息,请与我们联系