我正在尝试创建一个用于测试控制器的rails fixture,该控制器获取与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: '[email protected]').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'
架构包含版本表,其中包含相应的列btw。
我遇到了类似的问题。当我没有使用versions
fixture(没有版本夹具YAML文件)时,这导致versions
表没有在rake db:fixtures:load
上清除,所以这让我在开发环境调试上很困惑。
为了避免这个问题,我介绍了versions
夹具如下:
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)
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)..."
rake db:fixtures:load
!它应该加载版本夹具到PaperTrail :: Version AR和distribution_001记录.versions
方法应该包含它。注1:上面的item
是Label Reference
注2:whodunnit
应该是相同的。见Fixture label interpolation
我最终通过在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并使用灯具时朝着正确的方向前进。