Rspec before(:all) nie sprząta po sobie

witam
jak w tytule, w tabelach users i folders zostają wpisy i test za pierwszym razem przechodzi a za drugim się wywala

[code=ruby]require ‘spec_helper’

describe Folder do

it { should belong_to(:user) }
it { should belong_to(:project) }

it { should validate_presence_of(:name) }
it { should validate_length_of(:name, :within => Folder::NAME_LENGTH) }
it { should validate_uniqueness_of(:name) }

before(:all) do
@project = Factory(:project)
@user = Factory(:user)
@project.add_user(@user)
@folder = Factory(:folder, :project => @project, :user => @user)
end

describe “a new root folder” do
it “should have no parent” do
@folder.has_parent?.should be_false
end
end

describe “any folder” do
before(:all) do
@name = @folder.name
end

it "should not allow create a neighbour folder with the same name" do
  @neighbour_folder = Folder.create(:name => @name, :project => @project, :user => @user)
  @neighbour_folder.should_not be_valid
end

it "should allow create a folder with the same name but in different path" do
  @child_folder = Factory(:folder, :project => @project, :user => @user, :parent_folder_id => @folder.id)
  @same_name_folder = Factory(:folder, :name => @name, :project => @project, :user => @user, :parent_folder_id => @child_folder.id)
  @same_name_folder.should be_valid
end

end

end[/code]
pomaga usunięcie :all ale wtedy to jest odpalane przed każdym przypadkiem, a nie ma takiej potrzeby

Drugie pytanie jest takie, nazwa folderu musi być unikalna, chciałem przetestować czy w przypadku podania takiej samej model jest invalid. Jeśli tworzę go za pomocą Factory to wywala mi:

[quote]Failures:

  1. Folder any folder should not allow create a neighbour folder with the same name
    Failure/Error: @neighbour_folder = Factory.create(:folder, :name => @name, :project => @project, :user => @user)
    ActiveRecord::RecordInvalid:
    Validation failed: Name has already been taken

    ./spec/models/folder_spec.rb:48[/quote]

Dlatego zamiast factory musiałem użyć poprostu Folder.create, nie wiem czy to dobre podejście w takim przypadku

@neighbour_folder = Folder.create(:name => @name, :project => @project, :user => @user)

before :all w rspecu nie jest objęte tranzakcją, możesz użyć after all do wyczyszczenia danych - tylko sprawdz czy na pewno wszystko wyczyściłeś.

Jeśli chcesz przetestować walidację nazwy, to albo:
Tworzysz niezapisany obiekt za pomocą new i sprawdzasz czy jest valid:

Factory.create(:folder, :name => "Folder") folder = Factory.build(:folder, :name => "Folder") folder.should_not be_valid folder.should have(1).error_on(:name)
Albo sprawdzasz czy walidacja wywołała wyjątek:

Factory.create(:folder, :name => "Folder") expect do Factory.create(:folder, :name => "Folder") end.to raise_error(ActiveRecord::RecordInvalid,'Validation failed: Name has already been taken')
Polecam poczytać:
http://guides.rubyonrails.org/active_record_validations_callbacks.html#validations-overview
http://relishapp.com/rspec