Ruby on rails 使用acts_as_taggable_on为模型创建夹具数据

Ruby on rails 使用acts_as_taggable_on为模型创建夹具数据,ruby-on-rails,testing,fixtures,acts-as-taggable-on,Ruby On Rails,Testing,Fixtures,Acts As Taggable On,我正在使用插件为我的框架模型提供标记。我已经有了Rails生成的功能测试,以及它使用的装置,我想扩展它们来添加一些标记,这样我就可以测试按标记搜索,等等 我是否必须为标签和标签表格创建固定装置,并将其加载到功能测试的顶部?如果是,我该怎么做?我还没有弄清楚所描述的关系的语法。另一种选择是在测试搜索行为之前抓取框架实例并向其添加标记吗?或者如果我这么做,Rails神会击倒我吗?一般来说,最好是根据需要动态创建这些类型的东西。fixture可能很快变得非常难以管理,当您将来查看测试时,您需要查看三个

我正在使用插件为我的
框架
模型提供标记。我已经有了Rails生成的功能测试,以及它使用的装置,我想扩展它们来添加一些标记,这样我就可以测试按标记搜索,等等


我是否必须为
标签
标签
表格创建固定装置,并将其加载到功能测试的顶部?如果是,我该怎么做?我还没有弄清楚所描述的关系的语法。另一种选择是在测试搜索行为之前抓取
框架
实例并向其添加标记吗?或者如果我这么做,Rails神会击倒我吗?

一般来说,最好是根据需要动态创建这些类型的东西。fixture可能很快变得非常难以管理,当您将来查看测试时,您需要查看三个或四个fixture文件来取消选中正在发生的内容

我建议你花点时间去看看工厂女孩的宝石,这会在将来为你节省大量的时间。你可以这样做:

# test/factories.rb
Factory.define :framework do |f|
  # Add any properties to make a valid Framework instance here, i.e. if you have
  # validates_presence_of :name on the Framework model ...
  f.name 'Test Name'
end
class User < ActiveRecord::Base
  acts_as_taggable # Alias for acts_as_taggable_on :tags
  acts_as_taggable_on :skills, :interests
end
user1 = create(:user, tag_list: "SomeTag",
                      skill_list: "SomeSkillTag",
                      interest_list: "SomeInterestTag")
tagging:
  taggable: foo (Klass)
  context: tags
  tag: bar
然后,在功能测试或单元测试中,您可以轻松创建具有单个测试所需的特定属性的对象:

# Create and save in the DB with default values
@framework = Factory.create(:framework)
# Build an object with a different name and don't save it in the DB
@framework = Factory.build(:framework, :name => 'Other name'
# Create with tags
@framework = Factory.build(:framework, :tags_list => 'foo, bar')

使用:标记列表对我不起作用:

> undefined method `tags_list=' for #<Project:0xb610b24>
我还发现,这需要在父级工厂中进行,因为某些原因,它不能从子级开始工作。我还发现

@framework = Factory.build(:framework, :tag_list => 'foo, bar')
不会抛出错误,但不会创建标记


希望这有帮助

如果要使用TestUnit,请设置一些标记(在fixture文件tags.yml中):

然后设置标记(在fixture文件taggings.yml中):

tagging\u one:
标签号:
标记标识:
标记类型:框架
上下文:标记
基本上,
ActiveRecord::Fixtures.identification(:tag_one)
获取要放入右列的标记的ID。

这就是我如何将标记(使用
作为
上的标记)添加到我的用户模型(使用):

这样,当我只想创建一个常规的
Post
对象时,我会写:

create(:post)
create(:post, :poetry)
但是,当我想创建一个带有
诗歌
标记的
帖子时,我会写:

create(:post)
create(:post, :poetry)

这是我发现的在测试中添加标记的最简单方法。如果您有这样设置的模型:

# test/factories.rb
Factory.define :framework do |f|
  # Add any properties to make a valid Framework instance here, i.e. if you have
  # validates_presence_of :name on the Framework model ...
  f.name 'Test Name'
end
class User < ActiveRecord::Base
  acts_as_taggable # Alias for acts_as_taggable_on :tags
  acts_as_taggable_on :skills, :interests
end
user1 = create(:user, tag_list: "SomeTag",
                      skill_list: "SomeSkillTag",
                      interest_list: "SomeInterestTag")
tagging:
  taggable: foo (Klass)
  context: tags
  tag: bar

我也面临同样的问题。在做了一些尝试和错误之后,我提出了以下方法,通读了关于固定装置、关联和@barnaclebarnes对这个问题的回答的文档

我使用rails 4.2.0实现了这一点,并在3.5.0上充当标记

备注: 我先前的回答确实奏效,但有点古怪。在@David为我指出了一个更干净的方法之后,我完全重写了它——完全接受了我的尝试和错误,并坚持解决方案

促进更多轨道车载设施的方法 @barnaclebarnes解决方案将提供更多的自动化,但也意味着在ID上进行更多的键入和簿记。所以我一直在寻找一种更简洁的方法

多态关系 acts_as_taggable_on使用名为taggable的多态关系来实现标记与不同模型之间的关系。有关关联的详细信息,请参见《rails关联指南》

高级夹具 的rubydoc描述了ActiveRecord的工作方式以及它如何处理设备之间的关系(关联的章节标签参考):

活动记录反映装置的模型类,查找所有属于关联的对象,并允许您为关联[…]指定目标标签,而不是为FK[…]指定目标id

再往下一点,还有一些关于多态性的细节

这将允许这样的标记装置定义:

# test/factories.rb
Factory.define :framework do |f|
  # Add any properties to make a valid Framework instance here, i.e. if you have
  # validates_presence_of :name on the Framework model ...
  f.name 'Test Name'
end
class User < ActiveRecord::Base
  acts_as_taggable # Alias for acts_as_taggable_on :tags
  acts_as_taggable_on :skills, :interests
end
user1 = create(:user, tag_list: "SomeTag",
                      skill_list: "SomeSkillTag",
                      interest_list: "SomeInterestTag")
tagging:
  taggable: foo (Klass)
  context: tags
  tag: bar
名称空间的装置和模型 提供一种方法,用于在无法推断夹具时显式设置夹具的模型类。 换句话说:您可以使用目录为装置命名,并将其与其命名的模型相匹配。 要加载acts\u as\u taggable\u on的标记和标签的测试数据,我们可以将其固定装置放入子文件夹
fixtures/acts\u as\u taggable\u on/
(备注:
fixtures/ActsAsTaggableOn/

把它们放在一起
#models/item.rb
类项

如果您重新整理yaml文件,这将允许标记模型及其实例的维护定义非常低。

谢谢您的想法。在我的例子(ruby-on-rails4)中,tags.yml需要具有显式值的id。例如,
id:
非常感谢!请注意:从Rails 4开始,不推荐使用
ActiveRecord::Fixtures
,只需使用
ActiveRecord::FixtureSet
即可。这说明了为什么最初接受的答案建议为同一对象编写多个Fixtures可能很快变得无法管理。很高兴看到单个对象如何跨越多个装置。可以看出,很容易忘记哪些装置与作为单个对象一部分的其他装置相关联。谢谢这个例子。在你的“有点古怪”的解决方案中,没有必要定义新的模型。您可以将
actsastaggaleon
中的选项与
set\u fixture\u class
一起使用。例如,在
test\u helper.rb
中,在
fixtures:all
之后添加
set\u fixture\u class“tags”=>actsastaggaleon::Tag
set\u fixture\u class“taggings”=>actsastaggaleon::taging
。瞧!无需将新型号命名为
Tag
taging
。谢谢大卫给我指明了那个方向。据博士说