我有一个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中的测试。我应该完全在模型测试中搞砸数据库吗?
答案 0 :(得分:0)
每次运行都会删除测试数据库,并且每个单独的测试都会以事务方式运行它查询,因此您不能从一个测试到另一个测试共享对象。
如果您需要在测试之间共享对象,请使用setup
块https://guides.rubyonrails.org/testing.html#putting-it-together或只在同一个测试中一个接一个地运行两个查询。
答案 1 :(得分:0)
这取决于测试的设置方式。最有可能的是,您有一个单独的测试数据库,用于确定何时运行测试套件。如果使用默认的Rails数据库解决方案,请尝试从命令行运行sqlite3 <app-name>_test
。如果要查看开发数据库,请运行sqlite3 <app-name>_development
。