2016-10-31 3 views
0

Я тестирую., Что действие индекса "заполняет массив всех вопросов.rspec test GET #index - ожидаемая коллекция содержит

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 

Контроллеры/questions_controller

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

заводы/questions.rb

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

при выполнении тестов отображения ошибок:

1) QuestionsController GET #index заполнит массив всех вопросы Ошибка/Ошибка: ожидать (назначает (: вопросы)). 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)>' 

Почему бы не те же элементы коллекции?

ответ

1

Вам нужно создать вопросы в db? если вы проверяете, что @questions становится заселена, вы можете окурок этих DB звонков, что-то вроде

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 

Вам не нужно создавать реальную БД запись, если вы просто хотите, чтобы проверить назначение.

+0

вы можете объяснить, что делают этот код: @questions = [FactoryGirl.build_stubbed (: вопрос)] разрешить (Вопрос) .чтобы получить (: все) .and_return (@questions) –

+0

уверен, 'FactoryGirl.build_stubbed' создаст объект ActiveRecord (со всеми его свойствами) без записи в базу данных. 'allow (...). receive' call используется для издевательства (в данном случае) вызова в базу данных, так что это говорит: ok, когда' Question.all' получает вызов, возвращаем '@ questions'. .. так как вы не тестируете модель здесь, вы можете издеваться над вызовами db, на самом деле вам вообще не нужен тест контроллера, если вы кодируете тест интеграции, который выполняет весь стек –

+0

. good –