2017-05-05 3 views
0

Juste commuté de sqlite pour tester à pg. J'ai remarqué que, alors que la table de test efface bien, les ID ne redémarrent pas 1. En d'autres termes, étant donné le test: Si vous exécutez plusieurs testsRails spec utilisant l'environnement de test Postgres, les tables de test ne redémarrent pas l'incrément d'id?

describe "" do 
    before do 
    # some dummy is created 
    Object.create() 
    puts "count = #{Object.count}" 
    puts "last object_id = #{Object.id}" 
    end 
    ... 
end 

vous obtiendrez la sortie suivante :

count = 1 
last object_id = 1 
count = 1 
last object_id = 2 
count = 1 
last object_id = 3 
count = 1 
last object_id = 4 

alors que je me sens comme il vaut mieux à la fois effacer la table de test et redémarrez l'ID afin qu'il soit:

count = 1 
last object_id = 1 
count = 1 
last object_id = 1 
count = 1 
last object_id = 1 
count = 1 
last object_id = 1 

Je suppose que cela est juste quelque chose que j'ai besoin dans mon dossier spec_helper? Pour référence, fichier d'aide actuel ci-dessous, et j'utilise le database_cleaner gem. Merci!

RSpec.configure do |config| 
    # Database cleaner set up below 
    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    # Clean up all jobs specs with truncation 
    config.before(:each, js: true) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 
end 
+0

Habituellement, l'identifiant de l'objet n'a pas d'importance pour le test réel, de sorte que la réinitialisation de l'incrémentation automatique ne devrait pas être nécessaire. – Rafal

+0

Etes-vous sûr que vous exécutez le test à l'aide de la stratégie de troncature? Je m'attendrais à quelque chose comme 'describe" ", js: true' dans l'en-tête de votre test, donc je suppose que vous pourriez exécuter le test avec la stratégie de transaction à la place. Pouvez-vous montrer les journaux de test avec le test en cours? Là, vous devriez voir clairement s'il s'agit d'une transaction 'ROLLBACK' ou d'une troncature. – BoraMa

Répondre

0

Votre version psql probablement ci-dessous 8.4 qui est la raison pour laquelle il ne fonctionne pas.
Découvrez votre version avec psql --version, et à partir de la source de nettoyage de base de données dont vous avez besoin de 8.4 ou plus.

@restart_identity ||= db_version >= 80400 ? 'RESTART IDENTITY' : '' 

Je cours 9.6.2, ce qui fonctionne très bien.

> truncate users restart identity; 
> insert into users (x) values (1); 
> select * from users ; 

# id | x 
# ----+--- 
# 1 | 1 

Pour être sûr, le nettoyeur de base de données fonctionne bien aussi.

require 'rails/all' 
require 'database_cleaner' 
ActiveRecord::Base.establish_connection('postgres://localhost/test1') 
class User < ActiveRecord::Base; end 
User.count 
# => 1 
DatabaseCleaner.clean_with(:truncation, reset_ids: true) 

Il réinitialise les colonnes série.

$ psql -d test1 
> insert into users (x) values (1); 
> select * from users ; 

# id | x 
# ----+--- 
# 1 | 1 
+0

nah ... je viens d'installer aujourd'hui pour avoir la même version que vous faites, va continuer à chercher – james