ruby-on-rails - 使用 acts_as_taggable_on 为模型创建 fixture 数据

标签 ruby-on-rails testing fixtures acts-as-taggable-on

我正在使用 acts_as_taggable_on为我的 Framework 模型提供标记的插件。我有 Rails 生成的功能测试,以及它使用的固定装置,我想扩展它们以添加一些标签,以便我可以测试按标签搜索等。

我是否必须为 taggingstag 表创建固定装置并将它们加载到我的功能测试的顶部?如果是这样,我该怎么做?我还没有弄清楚 here 中描述的关系的语法.另一种方法是获取 Framework 实例并在测试搜索行为之前向其添加标签吗?或者,如果我这样做,Rails 之神会打败我吗?

最佳答案

我遇到了同样的问题。在我进行了一些反复试验之后,我想出了以下方法,通读了有关固定装置、关联和@barnaclebarnes 对这个问题的回答的文档。

我用 rails 4.2.0acts-as-taggable-on 3.5.0 做到了这一点。

备注: 我之前的回答成功了,但有点古怪。在@David 向我指出一种更简洁的方法后,我完全重写了它 - 完全省略了我的反复试验并坚持解决方案。

一种促进更多 rails 车载设施的方法

@barnaclebarnes 解决方案会提供更多的自动化,但也意味着更多的 id 打字和簿记。所以我一直在寻找更简洁的方法。

多态关系

acts_as_taggable_on 使用名为 taggable 的多态关系来实现标签与不​​同模型之间的关系。有关 polymorphic relations 的详细信息,请参阅关于关联的 Rails 指南.

高级 fixture

ActiveRecord::FixtureSet 的 ruby​​doc描述了 ActiveRecord 的工作原理以及它如何处理固定装置的关系(第 关联标签引用 章):

Active Record reflects on the fixture's model class, finds all the belongs_to associations, and allows you to specify a target label for the association [...] rather than a target id for the FK [...].

在页面的下方,还有一些关于多态 belongs_to 的详细信息。

这将允许像这样的标记 fixture 定义:

tagging:
  taggable: foo (Klass)
  context: tags
  tag: bar

命名空间装置和模型

ActiveRecord::TestFixtures提供一种方法来显式设置 fixture 的模型类,以防无法推断。 换句话说:您可以使用目录来命名装置并将它们与它们的命名空间模型相匹配。 要为 acts_as_taggable_on 的标签和标记加载测试数据,我们可以将它们的 fixture 放在子文件夹 fixtures/acts_as_taggable_on/ 中(备注:fixtures/ActsAsTaggableOn/也可以)

放在一起

# models/item.rb
class Item < ActiveRecord::Base
  acts_as_taggable_on
end

# fixtures/items.yml
item_1: {}
item_2: {}

# fixtures/acts_as_taggable_on/tags.yml
tag_1:
  name: tag_1
tag_2:
  name: tag_2

# fixtures/acts_as_taggable_on/taggings.yml
tagging_1
  taggable: item_1 (Item)
  context: tags
  tag: tag_1

如果您删除 yaml 文件,这允许对可标记模型及其实例进行相当低的维护定义。

关于ruby-on-rails - 使用 acts_as_taggable_on 为模型创建 fixture 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071205/

相关文章:

ruby-on-rails - will_paginate JSON 支持?

ruby-on-rails - 使用 carrierwave gem rails4 安全上传/下载文件

ruby-on-rails - 在 docker 容器中运行 Rails 应用程序

testing - 使用 Travis CI 进行 Flutter 集成测试

testing - 单击下载链接并应用 .wait(120000) 会引发错误

javascript - 如何重用 Jasmine 测试

ruby-on-rails - Rails 测试无故失败?

css - 将 'active' 类添加到 rails 中的所有事件链接?

angular - 单元测试 : No provider for "InterceptableStoreFactory" even if added to "providers"

grails - Grails固定装置和域类验证问题