Ich habe mehrere rspec-Tests, die Factory_girl verwenden. Es wird auf MongoDB mit MongoId in einer Rails 3 App verwendet.
Irgendwann teste ich gegen ungültige Werte: Ich erwarte Validierungsfehler. Danach rufe ich jedes Mal, wenn ich Factory(:user)
scheitert er aufgrund von Validierungsfehlern. Ich würde ein völlig neues und sauberes Objekt erwarten, wenn ich Factory(:user) aufrufe, nicht ein wiederverwendetes, ramponiertes.
Der folgende Beispielcode zeigt, wie die *user_spec.rb* ungültige Elemente zu "roles" hinzufügt. Das Benutzermodell markiert den Datensatz erfolgreich als ungültig .
Ein wenig weiter in den Spezifikationen muss eine *sidebar_helper_spec.rb* eine @user
und dort schlägt es fehl und sagt mir, dass die ungültige Rolle "foo" vorhanden ist. Sie können aber deutlich sehen, dass diese Rolle nicht in der Datenbank vorhanden ist. factory.rb .
Ist dieses Verhalten zu erwarten? Kann ich die Persistenz (oder Zwischenspeicherung?) mit einer Konfigurationsoption umschalten?
## models/user_spec.rb
require 'spec_helper'
describe User do
describe 'roles' do
before(:each) do
@user = Factory.build(:user)
end
it 'should require a role' do
@user.roles = nil
@user.should_not be_valid
end
it 'should allow one role from set of defined roles' do
#@user.roles is preset in factory with "jobseeker"
@user.should be_valid
end
it 'should reject undefined roles' do
@user.roles << "foo"
@user.should_not be_valid
end
it 'should allow multiple roles' do
@user.roles = ["banned", "jobseeker"]
@user.should be_valid
end
end
end
## helpers/sidebar_helper_spec.rb
require 'spec_helper'
describe SidebarHelper do
before(:each) do
@user = Factory.create(:user) #fails with Mongoid::Errors::Validations: Validation failed - Roles foo is an invalid role.
@profile = Factory.create(:profile)
end
# Has many specs, but all Fail on error in the before(:each)
end
## Actual factory.rb
Factory.define :user do |f|
f.password 'mischief managed'
f.email 'h.potter@gryffindor.hogwards.edu.wiz'
f.roles ['jobseeker']
end
Factory.define :employer do |f|
f.password 'butterscotch'
f.email 'dumbledore@staff.hogwards.edu.wiz'
f.roles ['employer']
end
Factory.define :profile do |f|
f.available true
f.sync false
end