28 Stimmen

Rails-Fixtures werden nicht mit rspec geladen

Also, ich versuche, das rspec BDD-Testframework im Rahmen eines Rails-Projekts zu lernen. Das Problem, das ich habe, ist, dass ich meine Fixtures einfach nicht dazu bringen kann, richtig in rspec-Beschreibungen geladen zu werden.

Haftungsausschluss: Ja, es gibt bessere Dinge als Fixtures zu benutzen. Ich versuche hier (speziell rspec) eine Sache nach der anderen zu lernen, bevor ich mit anderen Tools wie factory-girl, mocha, auto-test usw. spiele. Deshalb versuche ich, die einfachen, wenn auch umständlichen, Fixtures zum Laufen zu bringen.

Wie auch immer, hier ist der Code:

/test/fixtures/users.yml -

# password: "geheim"
foo:
  benutzername: foo
  email: foo@example.com
  passwort-hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f
  passwort-salz: bef65e058905c379436d80d1a32e7374b139e7b0

bar:
  benutzername: bar
  email: bar@example.com
  passwort-hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f
  passwort-salz: bef65e058905c379436d80d1a32e7374b139e7b0

/spec/controllers/pages_controller_spec.rb -

require 'spec/spec_helper'

describe PagesController do
  integrate_views
  fixtures :users
  it "soll beim Aufruf von index beim eingeloggt sein das Index-Template rendern" do
    session[:user_id] = user(:foo).id
    get 'index' 
    response.should render_template('index')
  end
end

Und was ich bekomme, wenn ich 'rake spec' ausführe ist:

NoMethodError in 'PagesController sollte das Index-Template beim Aufrufen des Index beim eingeloggt sein darstellen'
undefined method `user' for #
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/test_process.rb:511:in `method_missing'
./spec/controllers/pages_controller_spec.rb:7:

Das heißt, 'user(:foo)' wird nicht als gültige Methode erkannt.

Die Fixtures selbst müssen in Ordnung sein, denn wenn ich sie in die Entwicklungsdatenbank lade über 'rake db:fixtures:load', kann ich überprüfen, dass foo und bar in dieser Datenbank vorhanden sind.

Ich habe das Gefühl, dass ich hier etwas Offensichtliches übersehe, aber ich habe den ganzen Tag damit verbracht, erfolglos an meinen Haaren zu ziehen. Jede Hilfe wäre willkommen.

35voto

tadman Punkte 200181

Wenn Sie Fixtures als "Benutzer" definieren, dann ist der Weg, sie zu verwenden, über die Methode mit demselben Namen:

describe PagesController do
  integrate_views
  fixtures :users
  it "sollte das Index-Template bei einem Index-Aufruf rendern, wenn angemeldet" do
    session[:user_id] = users(:foo).id
    get 'index'
    response.should render_template('index')
  end
end

Das Singular ist nur für die Klasse selbst relevant (Benutzer). Hoffentlich haben Sie noch etwas Haare übrig, wenn dies nur ein Buchstabenfehler ist.

14voto

lobati Punkte 7583

Wenn Sie Ihre Fixtures global einrichten möchten, können Sie in Ihrem spec_helper oder rails_helper hinzufügen:

RSpec.configure do |config|
  config.global_fixtures = :all
end

2voto

Shaun Punkte 21

Es hat mir wirklich lange gedauert, das selbst herauszufinden.

# spec/rails_helper.rb

RSpec.configure do |config|
#  config.file_fixture_path = Rails.root / 'test' / 'fixtures' # <= falsch 
  config.fixture_path = Rails.root / 'test' / 'fixtures'

dann, wie in anderen Kommentaren erwähnt, verwenden Sie

RSpec.describe 'Events API', type: :request do
  fixtures :events

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