2014-06-10 3 views
1

Я пытаюсь проверить действие «post create» в контроллере. Во время «создания» в контроллере я назначаю переменную, значения которой изменяют новую запись до сохранения этой записи. Эта переменная @trip создается из значения сеанса, которое я не могу объяснить.Учетная запись переменной экземпляра, заданной значением сеанса в контроллере

Итак, мой вопрос, учитывая то, что я пытаюсь проверить, как наилучшим образом (или каким-либо образом) учитывать учетную запись экземпляра в контроллере, когда эта переменная задана значением сеанса? сообщение

Ошибка:

OrderItemsController POST create with valid attributes creates a new order item 
Failure/Error: expect{ post :create, order_item: FactoryGirl.attributes_for(:order_item) }.to change(OrderItem,:count).by(1) 
NoMethodError: 
     undefined method `company_id' for nil:NilClass 
# ./app/controllers/order_items_controller.rb:29:in `create' 
# ./spec/controllers/order_items_controller_spec.rb:47:in `block (4 levels) in <top (required)>' 

контроллер Спецификация:

describe "POST create action" do 
    let(:trip)    { create(:trip)} 
    let(:trip_date)   { create(:trip_date) } 
    let(:buyer)    { create(:buyer) } 
    let(:company)   { create(:company) } 
    let(:order_item)  { attributes_for(:order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) } 
    let(:bad_order_item) { attributes_for(:bad_order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) } 

    context "given valid order item attributes" do 
     it "creates a new order item" do 
      expect{ post :create, { order_item: order_item, trip_id: trip.id } }.to change(OrderItem, :count).by(1) 
     end 
    end 
end 

ссылки Ошибка линии 29 моего order_items_controller.rb, где переменная приходит в:

line 25: def create 
line 26:  @trip = Trip.find_by_id(session[:current_trip_id]) 
line 27:  @order_item = OrderItem.new(order_item_params) 
line 28:  @order_item.buyer_id   = current_user.id 
> line 29:  @order_item.company_id   = @trip.company_id 
line 30:  @order_item.first_person_cost = @trip.first_person_cost 
line 31:  @order_item.second_person_cost = @trip.second_person_cost 

line 32:  if @order_item.save 
line 33:   redirect_to cart_path(current_user), notice: 'New order item created.' 
line 34:  else 
line 35:   render 'new', notice: 'Unable to create new order item.' 
line 36:  end  
line 37: end 

ПРОЧИЕ ПОПЫТКИ

b. Я также пробовал:

let(:trip_date)   { create(:trip_date) } 
    let(:buyer)    { create(:buyer) } 
    let(:company)   { create(:company) } 
    let(:order_item)  { attributes_for(:order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) } 
    let(:bad_order_item) { attributes_for(:bad_order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) } 

    describe "POST create" do 
     let(:trip)  {create(:trip) } 
     context "with valid attributes" do 
      it "creates a new order item" do 
       Trip.stub_chain(:friendly, :find_by_id).and_return(trip) 
       expect{ post :create, order_item: order_item }.to change(OrderItem,:count).by(1) 
       end 
      end 
     end 
    end 

Результатом по той же ошибке.

c. Я также пробовал

Результатом по той же ошибке.

d. Я также попытался:

describe "POST create action" do 
     let(:trip_date)   { create(:trip_date) } 
     let(:buyer)    { create(:buyer) } 
     let(:company)   { create(:company) } 
     let(:bad_order_item) { attributes_for(:bad_order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) } 

     context "given valid order item attributes" do 
      it "creates a new order item" do 
      Trip.stub_chain(:friendly, :find_by_id).and_return(trip) 
      order_item = attributes_for(:order_item, trip_date_id: trip_date.id, buyer_id: buyer.id, company_id: company.id) 
      expect{ post :create, order_item: order_item }.to change(OrderItem, :count).by(1) 
     end 
    end 

Результирующее в:

1) OrderItemsController POST create action given valid order item attributes creates a new order item 
    Failure/Error: Trip.stub_chain(:friendly, :find_by_id).and_return(trip) 
    NameError: 
     undefined local variable or method `trip' for #<RSpec::ExampleGroups::OrderItemsController_2::POSTCreateAction::GivenValidOrderItemAttributes:0x0000010154d5d8> 
     # ./spec/controllers/order_items_controller_spec.rb:41:in `block (4 levels) in <top (required)>' 

Любая помощь приветствуется. Прошло пару недель. Благодарю.

+0

линии 26 не хватает]. Несомненно, он есть в оригинале. d - это только потому, что вы не определили поездку в тесте. Я бы убрал этот вопрос из вашего вопроса. В остальном вам нужно отлаживать. Поместите ведение журнала или контрольную точку в своем контроллере, чтобы увидеть, какие 'params [: trip_id]' и 'Trip.friendly' есть, и, может быть, вы узнаете что-то. –

+0

Извините, я не совсем понимаю. Строка 26 - это то, что я не могу объяснить в тестах. Это то, что вы подразумеваете под отсутствием?И вы говорите, что мои попытки, отличные от d, обычно на правильном пути? – steel

+0

В строке 26 ': trip_id' должен следовать'] ' –

ответ

1

Я наконец нашел правильные термины и нашел документы Rails, которые обсуждают, как устанавливать переменные сеанса для каждого действия. Мое решение выглядит следующим образом:

expect{ post :create, {order_item: order_item}, {"current_trip_id" => trip.id} }.to change(OrderItem, :count).by(1) 

Мое спасение лежало здесь: http://guides.rubyonrails.org/testing.html

0
expect{ post :create, order_item: order_item, trip_id: trip.id } 

Попробуйте изменить это:

expect{ post :create, { order_item: order_item, trip_id: trip.id } } 

post принимает как в Params хэш и хэш сессии в качестве аргументов; все опубликованные параметры должны быть в одном хэше.

+0

Я изменил код для соответствия, но не кубик. Я обновил свой код, чтобы показать, что я использовал в этой попытке (попытка c, выше) – steel

+0

Теперь основной пример. – steel

+2

Эти две линии ведут себя одинаково. –