2016-03-25 5 views
1

Test/test_helper.rb zurück:DatabaseCleaner nicht autoincrement Index in Schienen Testeinheit

ENV["RAILS_ENV"] ||= "test" 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'database_cleaner' 

DatabaseCleaner.strategy = :transaction 
DatabaseCleaner.clean_with(:truncation, pre_count: true, reset_ids: true) 

class ActiveSupport::TestCase 
    ActiveRecord::Migration.check_pending! 


    def setup 
    DatabaseCleaner.start 
    end 


    def teardown 
    DatabaseCleaner.clean 
    p '-------- DB Cleaned ---------' 
    end 

end 

Mein Test Unit-Datei: (test1 und 2 sind ein Duplikat)

require 'test_helper' 

class ItemTest < ActiveSupport::TestCase 

    test "test1" do 
    i = Item.create! 

    p ActiveRecord::Base.connection.execute("SELECT auto_increment FROM information_schema.tables WHERE table_schema = 'tmi_game_test' AND table_name = 'items';").first 

    assert_equal 1, Item.count 
    assert_equal 1, i.id 
    end 

    test "test2" do 
    i = Item.create! 

    p ActiveRecord::Base.connection.execute("SELECT auto_increment FROM information_schema.tables WHERE table_schema = 'tmi_game_test' AND table_name = 'items';").first 

    assert_equal 1, Item.count 
    assert_equal 1, i.id 
    end 

end 

Ergebnis:

# Running: 

[2] 
"-------- DB Cleaned ---------" 
.[3] 
"-------- DB Cleaned ---------" 
F 

Finished in 0.142886s, 13.9972 runs/s, 27.9944 assertions/s. 

    1) Failure: 
ItemTest#test_test2 [test/models/item_test.rb:45]: 
Expected: 1 
    Actual: 2 

2 runs, 4 assertions, 1 failures, 0 errors, 0 skips 

Warum funktioniert das nicht? Wo ist mein Fehler?

Antwort

3

Dies ist das erwartete Verhalten. Sie verwenden die Strategie :transaction zum Bereinigen von Tabellen. Dies bedeutet, dass jeder Test in eine Transaktion eingeschlossen wird, die ROLLBACK -ed nach dem Test ist (während teardown).

Sie nicht angegeben haben, welche Datenbank Sie verwenden, aber ROLLBACK nicht zurückgesetzt AUTO_INCREMENT Werte, weder in MySQL (siehe bug #6714) noch in PostgreSQL (siehe bug #1139).

In Übereinstimmung mit dieser SO answer Ich denke, dass Sie nie auf eine Auto_increment ID Wert in Ihren Tests verlassen sollten. Ich denke, Sie sollten stattdessen andere Attribute testen, um zu bestätigen, dass Sie mit dem erwarteten Datensatz arbeiten. Wenn Sie Ihre AUTO_INCREMENT Zähler wirklich zurücksetzen müssen, verwenden Sie stattdessen die :truncation Reinigungsstrategie. I.e. Entfernen Sie die Zeile clean_with, und legen Sie die Strategie einfach auf :truncation fest. Es ist jedoch viel langsamer als Transaktionen.

+0

'DatabaseCleaner.clean_with (: Trunkierung, pre_count: true, reset_ids: true)' Konfig, um Trunkierung zu verwenden, nein ?? – Matrix

+0

Ja, aber 'clean_with' reinigt die db sofort dort, wo sie aufgerufen wird, also einmal vor allen Tests in Ihrem Fall. Aber die AUTO_INCREMENTs werden nach jedem Test ** nicht zurückgesetzt **. – BoraMa

+0

ok ... das habe ich nicht verstanden. Also, was ist besser, rufen Sie 'clean_with (: truncation ...)' in Teardown-Methode auf, oder ändern Sie die Strategie in: trunkation? Was ist der Unterschied? – Matrix