2015-05-14 4 views
1

Я пытаюсь протестировать приложение 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 
+0

Я не думаю, вы можете издеваться над подключением к базе данных, так как это, вероятно, отключает соединение сокетов TCP/IP без HTTP. Если вы хотите издеваться над базой данных, что мешает вам просто создать базу данных sqlite в памяти, на которой может поговорить Sequel? Я думаю, что Sequel поставляется с этой функцией по умолчанию. Если это не сработает, то, что вы, возможно, захотите сделать, - обмануть сам объект Sequel, создав класс, который может быть помещен вместо Sequel, но его методы вернут объекты, которые вы ожидаете. – Ravenstine

+0

Знаете ли вы какие-либо ресурсы, которые помогут мне с последним? Я не верю, что смогу сделать первое. – NJP

+0

Вы уверены, что не можете сделать первое? '' '' Sequel.mock''' должен предоставить средство для подделки базы данных в памяти для работы в целях тестирования. Последнее так же просто, как создание класса/модуля, который имеет те же методы, которые вы вызываете в Sequel, но возвращаете то, что ожидает ваш код. Вы даже можете назвать его «Продолжить», если у вас еще нет реального требования, необходимого для тестирования. Вероятно, это будет больше, чем просто использование Sequel с одноразовой тестовой базой данных. http://sequel.jeremyevans.net/rdoc-adapters/classes/Sequel/Mock/Database.html – Ravenstine

ответ

3

Sequel поставляется с макетом адаптером для именно для этой цели:

@@db ||= Sequel.connect('mock://oracle') 

Смотрите документацию для получения подробной информации о том, как использовать высмеивал базу данных:

http://sequel.jeremyevans.net/rdoc-adapters/classes/Sequel/Mock/Database.html http://sequel.jeremyevans.net/rdoc-adapters/classes/Sequel/Mock/Dataset.html

Смежные вопросы