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?
können Sie erklären, was tun Sie diesen Code: @questions = [FactoryGirl.build_stubbed (: Frage)] erlauben (Frage) .to erhalten (: all) .and_return (@questions) –
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 –
danke. gute –