2017-05-05 1 views
0

Nur von sqlite zum Testen auf pg geschaltet. Ich bemerkte, dass, während die Testtabelle in Ordnung löscht, die IDs nicht neu starten zu 1. Also mit anderen Worten, da der Test:Rails-Spezifikation mit Postgres-Testumgebung, Testtabellen starten ID-Inkrement nicht neu?

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

Wenn Sie viele Tests durchgeführt werden Sie die folgende Ausgabe :

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

Während ich mag das Gefühl, es ist besser, um sowohl die Test-Tabelle löschen und die ID neu starten, damit es:

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

ich nehme an, das ich in meiner spec_helper Datei nur etwas brauchen? Als Referenz, aktuelle Hilfsdatei unten, und ich verwende den database_cleaner Edelstein. Vielen Dank!

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

Normalerweise ist die ID des Objekts für den eigentlichen Test irrelevant, daher sollte das automatische Inkrementieren nicht erforderlich sein. – Rafal

+0

Sind Sie sicher, dass Sie den Test mit der Trunkierungsstrategie ausführen? Ich würde etwas wie "beschreiben", "js: true" in der Kopfzeile Ihres Tests erwarten, also vermute ich, dass Sie den Test stattdessen mit der Transaktionsstrategie ausführen. Können Sie die Testprotokolle bei laufendem Test anzeigen? Dort sollten Sie deutlich sehen, ob es eine Transaktion "ROLLBACK" oder Trunkierung tut. – BoraMa

Antwort

0

Ihre psql Version unter 8.4 wahrscheinlich das ist, warum es nicht funktioniert.
Finden Sie Ihre Version mit psql --version heraus, und von der Datenbank-Reiniger-Quelle benötigen Sie 8,4 oder höher.

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

Ich bin mit 9.6.2, das funktioniert gut.

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

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

Um sicherzustellen, funktioniert Datenbank Reiniger auch gut.

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) 

Es setzt die seriellen Spalten zurück.

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

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

nah ... ich habe gerade heute installiert, also habe die gleiche Version, die du tust, werde weiter schauen – james