首页 > 解决方案 > Ruby on Rails 测试可以/应该持续到数据库吗?

问题描述

我有一个 DailyQuestionSet 模型和其中的一个方法(应该)进入数据库,查看当天是否已经存在 DailyQuestionSet,如果是,则返回它,如果不存在,则创建一个新的,将其保存到数据库并返回它。

当我从控制器而不是从模型的 Ruby on Rails 自动化测试中调用它时,这似乎有效。我不确定我是疯了还是错过了什么。

什么时候

class DailyQuestionSet < ApplicationRecord

 def DailyQuestionSet.get_today_dailyquestionset

    @dailyquestionset = nil
    @questionlist = nil

    @dailyquestionset_list = DailyQuestionSet.where('posed_date BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all

    if @dailyquestionset_list.empty?

      @dailyquestionset = DailyQuestionSet.create!(posed_date: DateTime.now)
      @dailyquestionset.save!

    else

      raise "disaster"
    end

    return @dailyquestionset

  end
end
class DailyQuestionSetTest < ActiveSupport::TestCase

  test "make sure today's daily_question_set has been deleted by the setup function" do
    # later add function to delete today's daily_question_set so we can create it and then make sure get_today_dailyquestionset has created it once and then we can refer back to the same row
  end

  test "create daily_question_set and make sure it has questions" do

    @dailyquestionset = DailyQuestionSet.get_today_dailyquestionset

    ....

  end

  test "create daily_question_set and make sure it has the same questions" do

    @dailyquestionset = DailyQuestionSet.get_today_dailyquestionset

    ....

  end

end

我认为这样做会在每次运行第一个测试时在数据库中的 daily_question_sets 表中添加一行,然后在运行第二个测试时检索该行。

但是当我查看测试数据库时,那里没有创建任何行。我想也许 Rails 没有将事务提交到数据库?

或者,更简单地说,raise "disaster"异常永远不会被抛出,因为 get_today_dailyquestionset 总是返回一个新的 DailyQuestionSet 并且永远不会获得它(应该)从数据库中创建的那个。

我想我可能从根本上误解了 Rails 中的测试。我应该在模型测试中搞乱数据库吗?

标签: ruby-on-rails

解决方案


每次运行时都会擦除测试数据库,并且每个单独的测试都会将其作为事务查询,因此您无法将对象从一个测试共享到另一个测试。

如果您需要在测试之间共享对象,请使用setuphttps://guides.rubyonrails.org/testing.html#putting-it-together或在同一个单独测试中一个接一个地运行两个查询。


推荐阅读