ruby-on-rails - 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 中的测试。我应该在模型测试中搞乱数据库吗?
解决方案
每次运行时都会擦除测试数据库,并且每个单独的测试都会将其作为事务查询,因此您无法将对象从一个测试共享到另一个测试。
如果您需要在测试之间共享对象,请使用setup
块https://guides.rubyonrails.org/testing.html#putting-it-together或在同一个单独测试中一个接一个地运行两个查询。
推荐阅读
- mongodb - mongo db schema 关系或在集合中
- javascript - 事件出队后,Javascript 事件循环如何处理非阻塞函数调用的执行?
- c - 一起使用 '#' 和 '##' 预处理运算符
- algorithm - 级别和相同时的递归树
- azure - 无应用服务的 Azure Function 发布管道(用于消费计划)
- ios - Swift:如何拆分字符串然后提取特定的子字符串?
- r - 有没有办法解决所有属性都具有 NA 值且行名具有 NA 值的行的问题?
- selenium - 我想用chrome上传
- java - 如何使用 Retrofit2
- objective-c - 有时 NSArrayController 在核心数据删除/更新后不刷新 NSTableView