2016-07-20 39 views
2

我正在使用rspec測試我的項目,現在我需要控制器部分。我測試了這個方法:在使用rspec進行測試時獲取nilClass錯誤

def accept 
    @app = App.find(params[:id]) 
    @invite = Invite.find_by(app: @app.name, receiver: current_dev.id) 
    @dev = Developer.find(@invite.sender) 
    @app.developers << @dev 
    respond_to do |format| 
    if @invite.destroy 
     format.html { redirect_to @app, notice: 'A new developer joined your team!' } 
     format.json { render :show, status: :destroyed, location: @app } 
    else 
     format.html { render :back } 
     format.json { render json: @invite.errors, status: :unprocessable_entity } 
    end 
    end 
end 

,這是測試部分:

it "should accept an invite (1)" do 
    invite = Invite.create(:app => "test", :sender => "2", :receiver => "1") 
    get :accept, :id => 1 
    assert_response :success 
end 

但是當我運行RSpec的命令,我得到這個錯誤:

InvitesController should accept an invite (1) 
Failure/Error: @dev = Developer.find(@invite.sender) 

NoMethodError: 
    undefined method `sender' for nil:NilClass 

所以我假設邀請對象是nil,但我無法弄清楚爲什麼會發生這種情況。我通過瀏覽器測試功能,一切正常。這也會在不同的控制器方法中導致相同的錯誤,每次只是因爲我的邀請對象是nil。這是爲什麼發生?

+0

在'accept'方法添加一個斷點,看看是否'@app.name ==「test''。如果是,那麼檢查'current_dev.id == 1'。 – ndn

+0

我最初的猜測是你創建的Invite沒有1的id。如果是這樣的話,只需將它作爲參數添加到規範中的Invite.create'調用。 – ndn

+0

等待,您看到的1作爲:get參數是由於我的路線爲方法是: apps /:id/requests/accept – AlterEchoes

回答

1

解決:

  • 主要原因事情不工作:失配導致邀請參數和電流參數之間(appcurrent_developer
  • 調試:需要在控制器什麼設置斷點/打印值以及該模型需要什麼。
  • 修復:爲了匹配參數而創建的對象缺失;正確的解決辦法是


it "should accept an invite (1)" do 
    invite = Invite.create(:app => @app.name, :sender => "2", :receiver => @developer.id) 
    get :accept, :id => @app.id 
    assert_response :redirect 
end 
+0

很好地完成,一旦系統允許你在兩天內接受它。 – ndn

相關問題