2016-11-23 4 views
0

У меня есть контроллер в приложении:Тест логики с RSpec

class CartsController < ApplicationController 
    def show 
    @cart = Cart.find(session[:cart_id]) 
    @products = @cart.products 
    end 
end 

и я написал некоторые первоначальные спецификации, чтобы проверить реакцию с помощью RSpec

RSpec.describe CartsController, type: :controller do      
    describe 'GET #show' do 
    before do 
     get :show 
    end 
    it { expect(response.status).to eq(200) } 
    it { expect(response.headers["Content-Type"]).to eql("text/html; charset=utf-8")} 
    it { is_expected.to render_template :show } 
    end 
end 

Теперь я собираюсь проверить логику метода шоу и должен напишите некоторое ожидание как:

it 'should be products in current cart' do 
    end 

, но я не знаю, как передать cart.id на сеанс hash

Обновление! Я пытаюсь написать экземпляры продукта, что будут связаны с текущей корзине:

let(:products_list){FactoryGirl.build_list(:product, cart_id: session[:cart_id])} 
    let(:cart){FactoryGirl.build(:cart)} 
    ... 
    it 'should be products in current cart' do 
     session[:cart_id] = cart.id 
     expect(assigns(:products)).to eq([products_list]) 
    end 

но получил ошибку:

CartsController GET #show should be products in current cart 
Failure/Error: let(:cart){FactoryGirl.build(:cart)} 

ArgumentError: 
    Trait not registered: products 
# ./spec/controllers/carts_controller_spec.rb:6:in `block (3 levels) in <top (required)>' 
# ./spec/controllers/carts_controller_spec.rb:15:in `block (3 levels) in <top (required)>'  

Что-то еще идет не так

+0

вы можете установить его прямо в своей спецификации или внутри 'перед каждым', блок, например 'session [: cart_id] = 1111' –

ответ

1

вы можете установить сеанс в вашем контрольный тест

it 'should be products in current cart' do 
    session[:cart_id] = 10 
    get :show 
end 
Смежные вопросы