【问题标题】:Access Attribute of Rails Test Fixture in Associated FixtureSet关联 FixtureSet 中 Rails 测试夹具的访问属性
【发布时间】:2016-05-21 10:22:00
【问题描述】:

背景

我的应用程序定义了 Employee 和 Company 模型之间的一对多关系。我已使用 Company 固定装置 (37_signals) 的标签为 Employee 固定装置分配了一家公司。但是,我还需要分配company_uuid,它是由SecureRandom.uuid 生成的。


示例

应用程序/模型/

employee.rb

class Employee
  belongs_to :company
end

公司.rb

class Company
  has_many :employees
end

测试/夹具/

employees.yml

employee:
  name: dhh
  company: 37_signals 
  company_uuid: <%= "Access the 37_signals company fixture's uuid here!" %>

companies.yml

37_signals:
  name: $LABEL
  company_uuid: <%= SecureRandom.uuid %>

问题

如何访问另一个 FixtureSet 中的 Fixture 属性?


已尝试

我尝试使用以下几行作为解决方案:

company_uuid: <%= ActiveRecord::FixtureSet.identify(:37_signals).company_uuid %>

上面找到公司的主键id值,然后调用company_uuid方法,对于整数是未定义的。这是无效的。

company_uuid: <%= companies(:37_signals).company_uuid %>

以上查找报告undefined method 'companies' for main:Object

有解决这个问题的常规方法吗?

【问题讨论】:

  • 原来这是一个无关紧要的装置。要运行该示例,您可以说在使用 after_update 回调关闭内部 JobAd 时创建 Employee。公司有_许多工作_广告。 JobAd has_one Employee, and Employee belongs_to Company, Employee belongs_to JobAd。

标签: ruby-on-rails ruby-on-rails-4 yaml fixtures


【解决方案1】:

嗯,第一个选项应该是干掉数据,所以它只存在于一个地方。您可以使用delegate 执行此操作,这样employee.company_uuid 将始终由employee.company.company_uuid 回答。

如果您在 Employee 模型中确实需要它,下一个最佳选择是使用回调(如 before_validateafter_save,具体取决于您的用例),将值从 Company 复制到 Employee目的。您希望消除数据值偏离其真实来源的可能性。

最后,您可以在创建时将所有 UUID 提取到两个固定装置均可访问的哈希中,并设置两个值,例如: company_uuid: <%= UUIDs['37_signals'] %> ...或类似的

【讨论】:

  • 这不是我正在寻找的直接解决方案,但我确实喜欢所有三个选项。不幸的是,违背我的意愿,我的应用程序存在广泛的 UUID 综合症,我必须保留这些数据。考虑到我的时间限制(以及缺乏测试),使用回调是一种可行但非平凡的重构!
  • 在进一步研究之后,我看到了曙光!模型回调是一个相对容易的重构。通过更多的测试覆盖率和重构时间,我认为delegate 将是一个很好的解决方案。
【解决方案2】:

这是我能想到的最佳解决方案:

company_uuid: <%= Company.find(ActiveRecord::FixtureSet.identify(:publish_and_export_album)).company_uuid %>

然而,这个解决方案似乎并不传统另外,我相信这很幸运,因为灯具是按字母顺序加载的。如果Company 被命名为Organization,在Employee 之后加载,那么我认为这不会按预期工作。 实际上,通过反复试验我确定这个方法的工作方向相反,所以 alpha -order 没有不利影响。

【讨论】:

  • 好吧,至少,请把这个可怕的结构包装在一个有名的方法中! :P
【解决方案3】:

如果您使用the fixture_builder gem,这不是问题。它允许您构建模型对象图并为它们指定夹具名称,并将它们保存到 .yml 夹具文件中。

【讨论】:

  • 看看下载量,我认为我不会称该 gem 为传统。这不是一个可行的重构,因为这个问题在我的应用程序中很普遍。感谢您的意见!
猜你喜欢
  • 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
相关资源
最近更新 更多