【问题标题】:Rails: Rspec and console output differRails:Rspec 和控制台输出不同
【发布时间】:2023-12-29 16:28:01
【问题描述】:

我的规格有问题。我正在尝试运行一个创建和销毁关联对象的规范,但我的所有规范都没有创建或销毁该对象。奇怪的是,我可以从字面上将每个测试中的每一行代码(.should 除外)复制并粘贴到控制台中,控制台将完美地运行每个期望,创建和销毁这些对象。这是一个示例:

it "should not destroy notification for like on comment" do
  comment = FactoryGirl.create(:comment)
  like = FactoryGirl.create_list(:like, 2, likable: comment)
  like.first.destroy
  note = comment.user.notifications.find_by(notifiable: comment, from_comment: false)
  note.should_not be_nil
end

只有对特定评论的第一个赞才会向该评论的作者发送通知。而如果一条评论只有一个点赞,而那个点赞被销毁了,它会销毁它最初发送的通知,但如果评论的点赞数超过0,它不会销毁通知。

问题是我没有编写可扩展的代码吗?我知道我的规格可能并不完美,但为什么控制台在输入相同的情况下会得到不同的结果?

【问题讨论】:

    标签: ruby-on-rails rspec rails-console


    【解决方案1】:

    您是在测试环境中运行您的 Rails 控制台,还是在默认情况下在开发中运行您的 Rails 控制台? 不同的数据库和环境配置可能是导致不同行为的原因,当您在控制台中手动测试时,开发数据库中可能已经存在 note 对象。

    要么尝试在测试环境中运行控制台:

    $ rails c test
    

    或者最好将调试器线暂时放在您的测试代码中(如果您还没有安装“调试器”gem,则需要安装它):

    it "should not destroy notification for like on comment" do
      comment = FactoryGirl.create(:comment)
      like = FactoryGirl.create_list(:like, 2, likable: comment)
    debugger
      like.first.destroy
      note = comment.user.notifications.find_by(notifiable: comment, from_comment: false)
      note.should_not be_nil
    end
    

    【讨论】:

    • 我一直在使用rails c test。我会试试调试器。
    • 一开始并没有创建通知......但它仍然在控制台中创建?这怎么可能?
    • 终于搞定了。这是因为 after_commit 回调而不是 after_save。我不知道为什么 after_commit 在控制台和规范中的行为不同,但事实就是如此。感谢您的调试提示!