Сконфигурируйте RSpec для выдачи ошибки при вызове БД в модульных тестах - PullRequest
0 голосов
/ 04 ноября 2019

Быстрые тесты, особенно юнит-тесты, должны быть написаны, и в этом нет никаких сомнений. Как настроить RSpec для выдачи ошибки при обнаружении попадания в базу данных в тесте, помеченном как :unit. Это усиливает стратегию написания быстрых тестов и позволяет избежать попаданий в базу данных, когда в этом нет необходимости.

Сейчас у меня есть этот код, но он всегда выдает ошибку, несмотря ни на что, даже если я поставлю простое puts "Hello"в тестовом примере.

config.around(:each, :unit) do |example|
  callback = lambda { |name, start, finish, message_id, payload|
    raise "Nope! Accessing the database in a unit test is not allowed!!\n\n Offending Query\n#{ payload[:sql] }"
  }
  ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
    example.run
  end
end
RSpec.describe CategoryTranslationCreator, :unit do
  it 'creates a category translation' do
    puts "Testing..."
  end
end

повышает

Got 0 failures and 2 other errors:

     1.1) Failure/Error: raise "Cannot access the database in a unit test!\n\n Offending Query\n#{"="*20}\n#{ payload[:sql] }"

          RuntimeError:
            Cannot access the database in a unit test!

             Offending Query
            ====================
            BEGIN
          # ./spec/rails_helper.rb:54:in `block (3 levels) in <top (required)>'
          # /home/jedrek/.rvm/gems/ruby-2.4.0/gems/database_cleaner-1.7.0/lib/database_cleaner/active_record/transaction.rb:12:in `start'
          # /home/jedrek/.rvm/gems/ruby-2.4.0/gems/database_cleaner-1.7.0/lib/database_cleaner/base.rb:90:in `start'
          # /home/jedrek/.rvm/gems/ruby-2.4.0/gems/database_cleaner-1.7.0/lib/database_cleaner/configuration.rb:75:in `block in start'
          # /home/jedrek/.rvm/gems/ruby-2.4.0/gems/database_cleaner-1.7.0/lib/database_cleaner/configuration.rb:75:in `each'
          # /home/jedrek/.rvm/gems/ruby-2.4.0/gems/database_cleaner-1.7.0/lib/database_cleaner/configuration.rb:75:in `start'
          # ./spec/support/database_cleaner.rb:12:in `block (2 levels) in <top (required)>'
          # ./spec/rails_helper.rb:57:in `block (3 levels) in <top (required)>'
          # ./spec/rails_helper.rb:56:in `block (2 levels) in <top (required)>'

     1.2) Failure/Error: raise "Cannot access the database in a unit test!\n\n Offending Query\n#{"="*20}\n#{ payload[:sql] }"

          RuntimeError:
            Cannot access the database in a unit test!

             Offending Query
            ====================
            SELECT c.relname FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = ANY (current_schemas(false)) AND c.relkind IN ('r')
          # ./spec/rails_helper.rb:54:in `block (3 levels) in <top (required)>'
          # ./spec/support/database_cleaner.rb:19:in `block (2 levels) in <top (required)>'
          # ./spec/rails_helper.rb:57:in `block (3 levels) in <top (required)>'
          # ./spec/rails_helper.rb:56:in `block (2 levels) in <top (required)>'
...