Warum würden rails nicht zurücksetzen die test-Datenbank zwischen den Läufen
Gibt es Kommentare in den Schienen codebase, die angeben, dass die test-Datenbank zurückgesetzt werden sollen zwischen den Läufen
rake -T
rake test:all # Run tests quickly by merging all types and not resetting db
rake test:all:db # Run tests quickly, but also reset db
config/database.yml
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
Diese doesn"t scheint der Fall zu sein für mich.
Ich bin mit factory girl generieren von test-Modelle, hier ist ein Beispiel Fabrik
FactoryGirl.define do
factory :podcast do
sequence(:title) { |n| "Podcast #{n}" }
sequence(:feed_url) { |n| "http://podcast.com/#{n}" }
end
end
Den podcast sollte ein einzigartiges feed_url, so dass ich bestätigen es die Einzigartigkeit des Modells.
class Podcast < ActiveRecord::Base
validates :feed_url, uniqueness: true, presence: true
end
In test_helper.rb
ich die Fussel alle Fabriken
ENV["RAILS_ENV"] ||= "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/autorun'
FactoryGirl.lint
Mein test erstellt einen podcast baut ein anderes mit dem gleichen Namen, der dann behauptet, dass der zweite
ist ungültig.
require 'test_helper'
describe Podcast do
describe '#feed_url' do
it 'must be unique' do
podcast = create(:podcast)
new_podcast = build(:podcast, feed_url: podcast.name)
assert_invalid podcast, :feed_url, 'has already been taken'
end
end
end
Als ich das erste mal laufen die tests ausgeführt, ohne Fehler, und die tests alle erfolgreich waren.
Das zweite mal, dass ich die tests ausführen des Factory Girl lint versagt, weil die podcast-feed_url bereits aufgenommen wurde.
Warum nicht die test-Datenbank wird aufgebaut zwischen den Läufen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben wir eine mehr beteiligt FactoryGirl eingerichtet, bereitet unsere Datenbank mit einigen kanonischen Elemente, aber ich denke, Sie könnte wahrscheinlich diesen code direkt in Ihre
test_helper.rb
zu gewährleisten, die Datenbank wird geleert:Alternativ, laufen
rake db:test:prepare
vor jedem Lauf.Gibt es ein Juwel zu, das Sie verwenden können, aber ich habe keine Erfahrung mit ihm: http://rubygems.org/gems/database_cleaner.
Den Grund, die Datenbank nicht zurücksetzen, ist, dass Sie Ihre tests außerhalb der Datenbank-Transaktion, die rails zur Verfügung stellt. Die
ActiveSupport::TestCase
- Klasse ist die Grundlage für alle Schienen-tests. ActiveRecord fügt eine pro-test-Datenbank-Transaktion zu dieser Klasse. Diese Transaktion wird zurückgesetzt, die Datenbank nach jedem test. Aber Sie laufen nicht Ihre tests mitActiveSupport::TestCase
sind, laufen Sie Ihre tests mitMinitest::Spec
die nicht konfiguriert ist zum ausführen der Transaktion.Die einfachste Lösung ist das hinzufügen minitest-Schienen zu Ihrer Gemfile, und ändern Sie das verlangen in Ihr test_helper.rb-Datei aus
minitest/autorun
zuminitest/rails
. Wenn Sie lieber Ihre eigene Unterstützung für Minitest ist spec DSL können Sie dieser Artikel als Ausgangspunkt.Haben Sie ein weiteres Werk, dass vielleicht das erstellen eines Podcasts über eine Vereinigung?
FactoryGirl linting baut jeder Fabrik und überprüft diese auf Gültigkeit, und wenn die andere Fabrik hat ein podcast als ein Verein, es werde erstellen Sie eine podcast-Aufzeichnung.
FactoryGirl empfiehlt das löschen der Datenbank nach der Ausführung des linting. Sie verwenden database_cleaner in Ihrem Beispiel:
https://github.com/thoughtbot/factory_girl/blob/2bf15e45305ac03315cf2ac153db523d3ce89ce1/GETTING_STARTED.md#linting-factories