簡體   English   中英

Rspec Capybara ActionView :: Template :: Error:nil:NilClass的未定義方法'action'

[英]Rspec Capybara ActionView::Template::Error: undefined method `action' for nil:NilClass

我正在測試名為“訂單”的模型的編輯視圖。

以普通用戶身份測試頁面工作正常,並且測試通過:

scenario 'a registered user can actually edit the comment of his order' do
    mycart = create(:cart)
    vest = create(:product, name: 'vest', price: '250000')
    jacket = create(:product, name: 'jacket-1', price: '300000')
    line_vest = create(:line_item, product: vest, unit_price: vest.price, cart: mycart)
    line_jacket = create(:line_item, product: jacket, unit_price: jacket.price, cart: mycart)
    Capybara.current_session.driver.header 'Referer', root_path
    order = create(:order, cart: mycart, user_id: 5)
    user = FactoryGirl.create(:user, id: 5)
    login_as(user)
    visit edit_order_path(order)
    fill_in 'Comment', with: 'This is the best order I have ever done'
    click_button 'Update Order'
    expect(page).to have_content 'This is the best order I have ever done'
  end

如果我嘗試以管理員身份運行相同的測試,並編輯屬於另一個用戶的訂單上的注釋,則測試將失敗:

scenario 'an admin can edit the comment of any order' do
    mycart = create(:cart)
    vest = create(:product, name: 'vest', price: '250000')
    jacket = create(:product, name: 'jacket-1', price: '300000')
    line_vest = create(:line_item, product: vest, unit_price: vest.price, cart: mycart)
    line_jacket = create(:line_item, product: jacket, unit_price: jacket.price, cart: mycart)
    Capybara.current_session.driver.header 'Referer', root_path
    order = create(:order, cart: mycart, user_id: 5)
    admin = FactoryGirl.create(:user, :admin)
    login_as(admin)
    visit edit_order_path(order)
    fill_in 'Comment', with: 'This is the best order I have ever done'
    click_button 'Update Order'
    expect(page).to have_content 'This is the best order I have ever done'
  end

我得到這個錯誤:

Failure/Error: click_button 'Update Order' 
ActionView::Template::Error:
undefined method `action' for nil:NilClass 

無論如何,如果我運行Web服務器,並且作為管理員嘗試更新訂單(屬於任何用戶),它都可以正常工作,因此只是測試不起作用。

以下是相關的控制器行:

  before_action :set_order, only: [:show, :update, :edit, :destroy]

 def edit
    unless (@order.user_id == current_user.id) or current_user.admin?
      redirect_to :back, :alert => "You are not authorized to view this page."
    end
  end

  def update
    flash[:notice] = 'Order was successfully updated.' if @order.update(order_params)
    respond_with(@order)
  end

    def set_order
      @order = Order.find(params[:id])
    end

我有一些類似的錯誤。

如果出現類似以下錯誤:

undefined method "method_name" for nil:NilClass

簡短的解釋是您的數據庫沒有實例化對象所需的視圖或控制器。 例如,如果您具有@ currency.get_symbol,則需要創建一個夾具或工廠,以便將貨幣插入數據庫以通過測試。

詳細說明:您可以閱讀本文以獲得更高級的說明和解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM