Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Meu aplicativo acessa um banco de dados remoto. Como executo testes de unidade com eficiência?

TL;DR:Use nulldb e uma classe pai com reconhecimento de teste


Use nulldb quando estiver testando e o db real caso contrário. Veja como:

Primeiro, inclua isso no seu Gemfile:
group :development, :test do
  gem 'activerecord-nulldb-adapter', :git => 'git://github.com/nulldb/nulldb.git'
end

e, em seguida, faça a bundle install usual

Defina uma classe base para todos os modelos suportados no banco de dados externo:
class ExternalModel < ActiveRecord::Base
  if Rails.app.test?
    establish_connection(:adapter => :nulldb)
  else
    establish_connection(:myapp)
  end

  def readonly?; true; end
end

Então todos os modelos externos herdam de ExternalModel (eu deveria ter feito isso desde o início):
class ExternalUser < ExternalModel
  ...
end

Quando executado em um ambiente de teste, ele não tentará se conectar à tabela externa. É claro que as tentativas de acessar uma instância de ExternalUser falharão, mas você pode estabelecer seletivamente uma conexão com o banco de dados externo durante o teste de integração, ou referências stub ou simuladas ao modelo externo.

Mais importante ainda, todos os meus testes rodam muito rápido agora.