【问题标题】:Rails YAML Fixture Error with PaperTrail gemPaperTrail gem的Rails YAML夹具错误
【发布时间】:2017-10-25 03:32:03
【问题描述】:

我正在尝试创建一个 rails 固定装置来测试一个控制器,该控制器获取与 paper_trail gem (7.0.1) 保持一致的版本。但是,到目前为止,我无法在夹具中填充任何版本来进行测试。而且,YAML 文件似乎没有加载/正在破坏其他测试。这是我的 `versions.yml` 文件的内容:

---
version_001:
  id: 1
  item_type: 'DistributionChannel'
  item_id: 1
  event: 'create'
  whodunnit: <%= User.find_by(email: 'user@example.com').id.to_s %>
  object: nil
  created_at: 2017-05-15 12:00:00.000000000 Z
  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'

架构包含带有相应列的版本表。

【问题讨论】:

  • 这里跑题了,object_changes需要用双引号吗?
  • 您会收到什么样的错误消息? object_changes 的值是否真的评估了 两次 以从加载的 YAML 中获取双反斜杠(对于它们,它们是 not 转义序列,即 \\n 加载为 3人物 )。你的确切问题是什么? paper_trail 是否有替代方案?如何将 YAML 转换为 JSON?是否可以使用 XML 编写测试?
  • 我在使用 db:fixtures:load 加载固定装置时实际上没有收到错误,但是在窥探测试时没有加载任何版本。我肯定想继续使用 paper_trail。而且,我的理解是我需要转义换行符,因此需要额外的“\”。我对固定装置很陌生,因为我更喜欢工厂。简而言之,我正在查看是否有任何明显的语法错误或其他问题,那些有 paper_trail 经验的人可能知道这会阻止固定装置加载。谢谢!

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


【解决方案1】:

我最终通过将以下内容添加到 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 是必要的,因为版本表在 PaperTrail 中命名空间。我已经看到一些关于适当的 yaml 语法的相互矛盾的信息,所以我很犹豫要解释我的理论为什么 yaml 语法有效(cmets 中的任何解释都将不胜感激)。但是,希望这将有助于在使用 Minitest 测试 paper_trail 并使用固定装置时为某人指明正确的方向。

【讨论】:

    【解决方案2】:

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

    为了避免这个问题,我引入versions夹具如下:

    1. 将夹具文件定位到 test/fixtures/paper_trail/versions.yml,以便 rake 任务自动加载它。
    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 方法应该包含它。

    注1:item 上面是Label Reference

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

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2012-11-21
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2018-01-01
      相关资源
      最近更新 更多