3 Stimmen

Wie kann man die Persistenz eines Factory Girl-Objekts vermeiden?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X