【问题标题】:It is possible create records in controller specs?可以在控制器规范中创建记录吗?
【发布时间】:2013-01-20 15:49:45
【问题描述】:

我写了下面的例子:

it "should assign @services containing all the current user services" do
  customer = FactoryGirl.create(:user, fullname: "Iris Steensma")
  sign_in customer
  service = FactoryGirl.create(:service, user: customer)
  puts "Service.count = #{Service.count}" # Service.count = 0
  get :home
  assigns[:services].should eq([service])
end

动作控制器为:

def home
 #@services = curent_user.posted_services
 @services = Service.all
end

且 factory.rb 包含:

FactoryGirl.define do

  sequence :address do |n|
    "Street #{n}"
  end

  factory :user do
    fullname "Foo Bar"
    email { "#{fullname.gsub(' ', '.').downcase}@example.com" if fullname }
    password "secret"
  end

  factory :preference do
    profile "customer"
    user
  end

  factory :service do
    status :pending
    source_addr { generate(:address) }
    target_addr { generate(:address) }
    passenger "Mis Daysi"
    start_at Time.now
    offer 5
    payment "cash"
    user
  end

end

为什么 Factory Girl 无法创建服务记录?工厂在“rails c test”测试环境下工作正常

这是 rspec 输出:

Failures:

  1) UsersController GET home should assign @services containing all the current user services
     Failure/Error: assigns[:services].should eq([service])

       expected: [#<Service:0x460d8ea @name="Service_1003">]
            got: []

       (compared using ==)

       Diff:
       @@ -1,2 +1,2 @@
       -[#<Service:0x460d8ea @name="Service_1003">]
       +[]

     # ./spec/controllers/users_controller_spec.rb:26:in `block (3 levels) in <top (required)>'

Finished in 1.03 seconds
3 examples, 1 failure

【问题讨论】:

  • 控制器操作的一个问题是它应该是@services = Service.all 而不是@services = Service.All
  • 另外,你能发布你遇到的错误吗?
  • 这两个数组是不同的对象,但它们的内容可以相同
  • @JoshuaRieken,实际上,控制器定义就像你说的(Service.all)。
  • 为了确保没有阻止服务创建的验证,您可以service = customer.services.create!(attributes_for(:service, user: customer))

标签: ruby-on-rails rspec devise factory-bot


【解决方案1】:

我相信正确的语法是:

assigns(:service).should eq([service])

根据 rspec 文档 assigns[key] 曾经是分配实例变量的方式,这看起来有点像你正在发生的事情。

https://github.com/rspec/rspec-rails

【讨论】:

  • 啊,对不起。我误会了。
【解决方案2】:

首先,这里的 user: customer 不需要,因为您使用的 customer.services.create 已经这样做了

service = customer.services.create(attributes_for(:service, user: customer))

其次,试试这个,在 service = customer.services.create 之后做类似的事情

service.valid?
puts service.errors.inspect
puts service.user == customer

也许你也可以试试

service = FactoryGirl.create(:service, :user => customer)

另外,您确定关联是在服务类上定义的吗?

没有

#<Service:0x57856f4 @name="Service_1003">

应该是

#<Service:0x57856f4 @name="Service_1003" user="<your customer object">

?

您的服务工厂是如何定义的?

【讨论】:

  • 谢谢@arieljuod,我得到了更多信息来检查正在发生的事情。我按照您的建议修改了示例,因此:service.valid? 返回 true,service.user == customer 返回 false(嗯??)。 puts service.errors.inspect 返回#&lt;ActiveModel::Errors:0xa768e8c @base=#&lt;Service:0x54a1348 @name="Service_1003"&gt;, @messages={}&gt;service.user 返回Service_#&lt;RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xa513934&gt;,最后一个好奇怪。另外,将service = customer.services.create 更改为service = FactoryGirl.create,结果是一样的。
  • 关联没问题,我在rails控制台使用测试环境得到了预期的结果(rails控制台测试)
  • 工厂可能有问题,你能把代码贴出来吗?
  • 我粘贴了 factory.rb 文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多