Ruby on Rails测试可以/应该保留到数据库吗?

时间:2019-04-22 13:39:21

标签: ruby-on-rails

我有一个DailyQuestionSet模型和一个要进入数据库的方法,应该查看该日期是否已经存在DailyQuestionSet,如果存在,请返回该模型,如果不存在,请创建一个新模型,然后保存并将其返回数据库。

当我从Controller而不是从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中的测试。我应该完全在模型测试中搞砸数据库吗?

2 个答案:

答案 0 :(得分:0)

每次运行都会删除测试数据库,并且每个单独的测试都会以事务方式运行它查询,因此您不能从一个测试到另一个测试共享对象。

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

答案 1 :(得分:0)

这取决于测试的设置方式。最有可能的是,您有一个单独的测试数据库,用于确定何时运行测试套件。如果使用默认的Rails数据库解决方案,请尝试从命令行运行sqlite3 <app-name>_test。如果要查看开发数据库,​​请运行sqlite3 <app-name>_development