使用 FactoryGirl 设置受保护的属性

发布于 2024-12-27 19:41:28 字数 319 浏览 0 评论 0原文

FactoryGirl 不会设置我的受保护属性 user.confirmed。这里的最佳实践是什么?

Factory.define :user do |f|
  f.name "Tim"          # attr_accessible -- this works
  f.confirmed true      # attr_protected -- doesn't work
end 

我可以在使用我的工厂后执行 @user.confirmed = true ,但这需要在大量测试中进行大量重复。

FactoryGirl won't set my protected attribute user.confirmed. What's the best practice here?

Factory.define :user do |f|
  f.name "Tim"          # attr_accessible -- this works
  f.confirmed true      # attr_protected -- doesn't work
end 

I can do a @user.confirmed = true after using my factory, but that's a lot of repetition across a lot of tests.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

嘦怹 2025-01-03 19:41:28

使用 after_create 钩子有效:

Factory.define :user do |f|
  f.name "Tim"
  f.after_create do |user|
    user.confirmed = true
    user.save
  end
end 

Using an after_create hook works:

Factory.define :user do |f|
  f.name "Tim"
  f.after_create do |user|
    user.confirmed = true
    user.save
  end
end 
不可一世的女人 2025-01-03 19:41:28

创建用户时,您必须将其传递到哈希中,因为 FactoryGirl 正在保护它免遭批量分配。

user ||= Factory(:user, :confirmed => true)

You would have to pass it into the hash when you create the user since FactoryGirl is protecting it from mass-assignment.

user ||= Factory(:user, :confirmed => true)
定格我的天空 2025-01-03 19:41:28

另一种方法是使用 Rails 的内置角色,如下所示:

#user.rb
attr_accessor :confirmed, :as => :factory_girl

当批量分配 FactoryGirl 广播此角色时,使此模式成为可能。

优点:使工厂保持快速、简单和干净(回调中的代码更少)
缺点:您正在更改测试的模型代码:(

一些未经测试的建议来解决缺点:

  • 您可以重新打开工厂上方的类。
  • 您可以在 [测试|规范]_helper

Another approach is to use Rails' built in roles like this:

#user.rb
attr_accessor :confirmed, :as => :factory_girl

When mass-assigning FactoryGirl broadcasts this role, making this pattern possible.

Pros: Keeps factories fast, simple, and clean (less code in callbacks)
Cons: You are changing your model code for your tests :(

Some untested suggestions to address the Con:

  • You could re-open the class just above your factory.
  • You could re-open the class in a [test|spec]_helper
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文