代码之家  ›  专栏  ›  技术社区  ›  MikeJ

在rails单元测试中,如何让用户fixture加载其相关的概要文件?

  •  8
  • MikeJ  · 技术社区  · 14 年前

    在有关固定装置的文件中( http://api.rubyonrails.org/classes/Fixtures.html )它们提供了以下将标签引用用于关联的示例:

    ### in pirates.yml
    reginald:
      name: Reginald the Pirate
      monkey: george
    
    ### in monkeys.yml
    george:
      name: George the Monkey
      pirate: reginald
    

    因此,根据他们的线索,我有一个用户模型,其中包含一个:profile,一个属于:user的profile模型,并尝试根据他们的示例设置fixture:

    ### in users.yml
    reginald:
      id: 1
      login: reginald
    
    ### in profiles.yml
    reginalds_profile:
      id: 1
      name: Reginald the Pirate
      user: reginald
    

    (注意:由于我的关联是单向的,所以用户fixture没有“profile:reginalds_profile”关联——放入它会导致错误,因为sql表没有profile_id属性。)

    问题是,在我的单元测试中,似乎所有东西都加载正确,但是用户(:reginald).profile总是为零。我错过了什么?

    2 回复  |  直到 14 年前
        1
  •  18
  •   Community Sam Holder    7 年前

    根据塔德曼的建议,我做了更多的搜索,并在这个网站的其他地方找到了答案,所以我不妨把它贴出来。

    见标题为 Automatic associations in ruby on rails fixtures

    显然,当您使用标签(user:reginald)而不是id(user_id:1)时,rails查找关联fixture的方法是散列名称并假设散列是id。如果您将id设置为特定的值,则这将失败。但是如果让rails自动分配id,它会使用散列方案。因此,fixture关联标签的文档缺少一个关键的tidbit——如果使用标签,则必须避免在要匹配的fixture中应用自己的id。与标签不匹配的设备仍然可以使用您选择的任何ID方案。

        2
  •  3
  •   tadman    14 年前

    您可能必须声明您正在加载所有这些fixture,因为我不相信fixture loader会自动遵循这样的关联。在某些情况下,您可能需要做的不仅仅是:

    fixtures :all
    

    事实上,它们中的每一个:

    fixtures :users, :profiles