2016-10-31 4 views
0

ich test., Dass index aktion 'bevölkert eine anordnung aller fragen.rspec test GET #index - erwartete sammlung enthalten

require 'rails_helper' 

RSpec.describe QuestionsController, type: :controller do 
    describe 'GET #index' do 
    before do 
     @questions = FactoryGirl.create_list(:question, 2) 
     get :index 
    end 

    it 'populates an array of all questions' do 
     binding.pry 
     expect(assigns(:questions)).to match_array(@questions) 
    end 
    it 'renders index view' do 
     expect(response).to render_template(:index) 
    end 
    end 
end 

Controller/questions_controller

class QuestionsController < ApplicationController 
    def index 
     @questions = Question.all   
    end 
end 

Fabriken/questions.rb

FactoryGirl.define do 
    factory :question do 
    title "MyString" 
    body "MyText" 
    end 
end 

Beim Ausführen von Tests Fehleranzeige:

1) QuestionsController GET #INDEX ein Array aller auffüllt Fragen Fehler/Fehler: expect (ordnet (: Fragen)). zu match_array (@questions)

expected collection contained: 

[#<Question id: 37, title: "MyString", body: "MyText", created_at: "2016-10-31 19:37:12", updated_at:...: "MyString", body: "MyText", created_at: "2016-10-31 19:37:12", updated_at: "2016-10-31 19:37:12">] 
     actual collection contained: [#<Question id: 15, title: "MyString", body: "MyText", created_at: "2016-10-30 21:23:52", updated_at:...: "MyString", body: "MyText", created_at: "2016-10-31 19:37:12", updated_at: "2016-10-31 19:37:12">] 
     the extra elements were:  [#<Question id: 15, title: "MyString", body: "MyText", created_at: "2016-10-30 21:23:52", updated_at:...: "MyString", body: "MyText", created_at: "2016-10-30 21:23:52", updated_at: "2016-10-30 21:23:52">] 
# ./spec/controllers/questions_controller_spec.rb:12:in `block (3 levels) in <top (required)>' 

Warum nicht die gleichen Elemente der Sammlung?

Antwort

1

tun müssen, um Sie Fragen in db erstellen? wenn Sie testen, dass @questions ist bevölkert zu werden, können Sie diese db Anrufe, so etwas wie

describe 'GET #index' do 
    before do 
    @questions = [FactoryGirl.build_stubbed(:question)] 
    allow(Question).to receive(:all).and_return(@questions) 
    get :index 
    end 

    it 'populates an array of all questions' do 
    expect(assigns(:questions)).to match_array(@questions) 
    end 
end 

Sie brauchen nicht zu erstellen tatsächlichen db Aufzeichnungen Stummel, wenn Sie nur die Zuordnung testen möchten.

+0

können Sie erklären, was tun Sie diesen Code: @questions = [FactoryGirl.build_stubbed (: Frage)] erlauben (Frage) .to erhalten (: all) .and_return (@questions) –

+0

sicher, 'FactoryGirl.build_stubbed' erstellt ein ActiveRecord-Objekt (mit all seinen Eigenschaften), ohne in die Datenbank zu schreiben. Der 'allow (...). to receive'-Aufruf wird verwendet, um (in diesem Fall) einen Aufruf an die Datenbank zu simulieren, also, das heißt: ok, wenn' Question.all' aufgerufen wird, gebe '@ questions' zurück. .. da Sie das Modell hier nicht testen, können Sie DB-Aufrufe mocksen, tatsächlich brauchen Sie überhaupt keinen Controller-Test, wenn Sie einen Integrationstest codieren, der den ganzen Stack ausübt –

+0

danke. gute –