Я пытаюсь протестировать приложение Rails, которое подключается к удаленной базе данных Oracle, используя камень Sequel. Поскольку пользователь должен войти в систему, чтобы использовать сайт, я использую WebMock. Однако, поскольку WebMock останавливает все запросы к внешним источникам, я получаю ошибку Sequel::DatabaseConnectionError: OCIError: ORA-12541: TNS:no listener
каждый раз, когда я запускаю свои тесты. Как мне высмеять соединение с базой данных? Должен ли я попробовать что-то другое вместо этого?Mock Последовательные соединения с базой данных Oracle
Я не уверен, что код, чтобы обеспечить, так вот некоторые фрагменты, которые могут быть связаны с возможными решениями:
database_connection.rb
:
class DatabaseConnection
@@db = nil
def self.get_db
@@db ||= Sequel.connect(Settings.db.main.to_hash)
end
def self.db_query(query)
get_db[query]
end
end
В spec_helper.rb
:
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)
RSpec.configure do |config|
config.before(:each) do
stub_request(:post, "/path/to/third/party").
with(:body => "request body").
to_return(:status => 200, :body => "", :headers => {})
end
# ... rest of the code
end
Соответствующий драгоценные камни от Gemfile
:
gem 'rails', '4.0.2'
gem 'ruby-oci8', git: 'https://github.com/kubo/ruby-oci8.git'
group :development, :test do
gem 'rspec-rails', '~> 3.2.0'
end
group :test do
gem 'webmock' # 1.21.0
gem 'capybara' # 2.4.4
end
Я не думаю, вы можете издеваться над подключением к базе данных, так как это, вероятно, отключает соединение сокетов TCP/IP без HTTP. Если вы хотите издеваться над базой данных, что мешает вам просто создать базу данных sqlite в памяти, на которой может поговорить Sequel? Я думаю, что Sequel поставляется с этой функцией по умолчанию. Если это не сработает, то, что вы, возможно, захотите сделать, - обмануть сам объект Sequel, создав класс, который может быть помещен вместо Sequel, но его методы вернут объекты, которые вы ожидаете. – Ravenstine
Знаете ли вы какие-либо ресурсы, которые помогут мне с последним? Я не верю, что смогу сделать первое. – NJP
Вы уверены, что не можете сделать первое? '' '' Sequel.mock''' должен предоставить средство для подделки базы данных в памяти для работы в целях тестирования. Последнее так же просто, как создание класса/модуля, который имеет те же методы, которые вы вызываете в Sequel, но возвращаете то, что ожидает ваш код. Вы даже можете назвать его «Продолжить», если у вас еще нет реального требования, необходимого для тестирования. Вероятно, это будет больше, чем просто использование Sequel с одноразовой тестовой базой данных. http://sequel.jeremyevans.net/rdoc-adapters/classes/Sequel/Mock/Database.html – Ravenstine