Ich bin an dem Punkt angelangt, an dem ich einen Admin-Dashboard-Teil meiner App entwickle, und für jede Aktion muss der Benutzer angemeldet sein.

So zum Beispiel dieser Test:

describe 'GET #index' do
    let(:user) { create(:user) }

    before do
      sign_in user
    end

    it 'responds successfully with an HTTP 200 status code' do
      get :index
      expect(response).to be_success
      expect(response).to have_http_status(200)
    end

    it 'renders the index template' do
      get :index
      expect(response).to render_template('index')
    end

    it 'loads all of the tags into @tags' do
      tag1 = create(:tag)
      tag2 = create(:tag)
      get :index

      expect(assigns(:tags)).to match_array([tag1, tag2])
    end
  end

Funktioniert einwandfrei, aber ich habe mir überlegt, ob ich den Teil Benutzererstellung und Anmeldung zu etwas extrahieren könnte, das ich für all diese Admin-Tests verwenden kann. Ich habe es versucht:

describe 'GET #index', admin: true do
 ....all the same as above, except user creation and before sign in block
end

Dann habe ich in meinem spec/spec_helper.rb Folgendes hinzugefügt:

config.before(:each, admin: true) do |_example|
  before do
    sign_in FactoryGirl.create(:user)
  end
end

Leider hat das nicht funktioniert. Gibt es eine bessere Möglichkeit, dies zu tun? Erreichen Sie das Gleiche, dass ich den Anmeldecode an einer Stelle ablegen kann und ihn in meinen Administratortests nicht erneut einfügen muss.

Ich benutze Rails 4 und Rspec 3.

0
Gandalf StormCrow 23 Dez. 2015 im 01:31

2 Antworten

Beste Antwort

Sie haben eine zusätzliche vor Block. entferne es so ...

config.before(:each, admin: true) do |_example|
  before do
    sign_in FactoryGirl.create(:user)
  end
end

Wird dies ...

config.before(:each, admin: true) do
  sign_in FactoryGirl.create(:user)
end

Auch wenn dies Controller-Spezifikationen sind (wie sie scheinen), dann ist dies ...

describe 'GET #index' do

Sollte eigentlich so aussehen ...

describe SomeController, type: :controller, admin: true do
1
MilesStanfield 24 Dez. 2015 im 07:54

Gemeinsame Beispiele sind eine gute Möglichkeit, Ihre Spezifikationen zu bereinigen und Codeduplikationen zu entfernen. Schauen Sie sich https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples

0
Laurens 22 Dez. 2015 im 22:43