Я пытаюсь проверить действие «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)>'
Любая помощь приветствуется. Прошло пару недель. Благодарю.
линии 26 не хватает]. Несомненно, он есть в оригинале. d - это только потому, что вы не определили поездку в тесте. Я бы убрал этот вопрос из вашего вопроса. В остальном вам нужно отлаживать. Поместите ведение журнала или контрольную точку в своем контроллере, чтобы увидеть, какие 'params [: trip_id]' и 'Trip.friendly' есть, и, может быть, вы узнаете что-то. –
Извините, я не совсем понимаю. Строка 26 - это то, что я не могу объяснить в тестах. Это то, что вы подразумеваете под отсутствием?И вы говорите, что мои попытки, отличные от d, обычно на правильном пути? – steel
В строке 26 ': trip_id' должен следовать'] ' –