我们有一个类,用户,带有Carrierwave头像,其存在是必要的但不足以触发回调:
class User < ActiveRecord::Base
# ... various other stuff
before_update :do_stuff, if: :avatar_changed_and_stuff?
mount_uploader :avatar, AvatarUploader
def avatar_changed_and_stuff?
# Check if any of a number of conditions has just been met,
# including avatar just having been added
end
end
在测试中,这让我非常头疼。我喜欢这样做的方式是
构建满足所有#ac&amp; s条件的用户对象
对于每个条件,将其设为false,然后将其设为true,并检查#do_stuff是否发生
对于大多数其他条件,这只是意味着将属性设置为nil,然后返回到它的任何位置。但是因为Carrierwave会覆盖'avatar'属性,所以我不能只做user.update(avatar: nil)
。
相反,遵循自述文件,我已用
删除它user.remove_avatar!
user.save
问题是,当我在同一个测试中尝试重新附加一个文件时,就像我在测试准备[1]中那样,它不起作用 - user.avatar.file
仍然是{{1} }。
我花了一段时间浏览Carrierwave宝石的来源,但未能找到这种行为的原因。最后,我通过简单地生成记录的新实例来攻击它...
nil
...然后继续对新对象进行测试。这是有效的,但是a)令人沮丧的是,我无法弄清楚为什么,b)它可怕的丑陋。有更好的方法吗?
[1]就是这样:
user_x = User.find user.id