Могут ли / должны ли тесты Ruby on Rails сохраниться в базе данных? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть модель 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.Стоит ли вообще возиться с БД в модельных тестах?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Это зависит от того, как настроены ваши тесты.Скорее всего, у вас есть отдельная тестовая база данных для запуска набора тестов.Попробуйте запустить sqlite3 <app-name>_test из командной строки, если вы используете решение базы данных Rails по умолчанию.Если вы хотите просмотреть базу данных разработки, вы должны запустить sqlite3 <app-name>_development.

0 голосов
/ 22 апреля 2019

Тестовая база данных стирается при каждом запуске, и каждый отдельный тест выполняет запросы как транзакции, поэтому вы не можете обмениваться объектами из одного теста в другой.

Если вам нужны объекты, совместно используемые тестами, используйте setup блок https://guides.rubyonrails.org/testing.html#putting-it-together или просто выполняйте оба запроса один за другим в одном и том же отдельном тесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...