使用PaperTrail gem导航YAML夹具错误

时间:2017-05-24 16:47:55

标签: ruby-on-rails ruby fixtures paper-trail-gem

我正在尝试创建一个rails fixture来测试一个控制器,该控制器获取持久存在paper_trail gem(7.0.1)的版本。但是,到目前为止,我还是无法在灯具内填充任何版本进行测试。而且,看起来YAML文件没有加载/正在打破其他测试。这是我的`versions.yml``文件的内容:

with open("C:\pavan\pav.csv",'a',newline='') as wr:

架构包含版本表,其中包含相应的列btw。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。当我没有使用versions fixture(没有版本夹具YAML文件)时,这导致versions表未在rake db:fixtures:load上清除,因此这使我对开发感到困惑环境调试。

为了避免这个问题,我引入了versions fixture,如下所示:

  1. 找到fix / fixtures / paper_trail / versions.yml的fixture文件,以便rake task自动加载。
  2. 手动编写object_changes数据是一项相当繁琐的工作,因此我们可以使用to_yaml方法生成它,如下所示。创建和/或更新AR会生成版本记录,以便在命令行跟随生成yaml文件到tmp / versions.yml:

    $ rails console
    irb> File.write('tmp/versions.yml', PaperTrail::Version.all.map{|v| v.attributes}.to_yaml)
    
  3. 按如下方式编辑tmp / versions.yml并将其保存到test / fixtures / paper_trail / versions.yml:

    version_001:
      item_type:  DistributionChannel
      item:       distribution_001
      event:      create
      whodunnit:  ...
      created_at: 2017-12-27 02:25:33.000000000 Z
      object_changes: "... (keep as above to_yaml generated)..."
    
  4. 现在,运行rake db:fixtures:load!它应该将版本夹具加载到PaperTrail :: Version AR,而distribution_001记录.versions方法应该包含它。
  5. 注意事项1:上面itemLabel Reference

    注意2:whodunnit应该是相同的。见Fixture label interpolation

答案 1 :(得分:0)

我最终通过在test_helper.rb中添加以下内容来加载夹具:

self.set_fixture_class versions: PaperTrail::Version

并且,使用以下yaml语法:

version_001:
  id: 1
  item_type: 'DistributionChannel'
  item_id: 1
  event: 'create'
  whodunnit: <%= ActiveRecord::FixtureSet.identify('user_example').to_s %>
  object: nil
  created_at: 2017-05-15 12:00:00
  object_changes: "---\nid:\n- \n- 1\nprimary_channel:\n- \n- Best Buy\nsecondary_channel:\n- \n- ''\ncreated_at:\n- \n- 2017-05-15 12:00:00.000000000 Z\nupdated_at:\n- \n- 2017-05-15 12:00:00.000000000 Z\n"

必须添加test_helper.rb,因为Version表在PaperTrail中是命名空间。我已经看到了一些关于适当的yaml语法的相互矛盾的信息,所以我很犹豫地解释我的理论为什么yaml语法有效(评论中的任何解释都会非常感激)。但是,希望这有助于指导某人在使用Minitest测试paper_trail并使用灯具时朝着正确的方向前进。