有一个奇怪的问题,我找不到任何地址。
我在项目中使用Resque和DatabaseCleaner来清理测试。我们的测试套件需要实际使用常规的resque / redis(所以我们不能使用monkeypatching ResqueSpec,因为它通过使用Resque / Redis来实现)。
我们一直在尝试使用DBCleaner的:transaction
策略,但是因为Resque产生了自己的ActiveRecord连接after_fork(参见下面的代码),所以事务不起作用,因为mysql只允许在一个事件上看到事务。单一连接。
Resque这样做:
Resque.after_fork { ActiveRecord::Base.establish_connection if defined?(ActiveRecord) }
简单的解决方案是使用带有:truncation
策略的DB清理程序。我们希望只有在使用Resque时才能启用:truncation
,然后在运行不相关的规范时返回:transaction
。
部分技巧是我们的Resque工作人员在规范期间启动并运行。它在测试规范启动时启动一个worker,然后在@resque
标记的规范通过一组Before
/ After
挂钩运行后暂停工作进程。
所以问题是我们如何让DatabaseCleaner有效地切换所有活动的ActiveRecord数据库连接以使用正确的清理策略? DatabaseCleaner提供了针对不同规范切换策略的方法,但它似乎没有切换到所有连接,而只是切换到主Rails进程AR连接。
同样,现在的解决方案是到处使用:truncation
。只是想知道是否有人对如何解决这个问题有任何想法。