2012-08-30 38 views
1

我想用rspec來測試一個現有的rails項目。我想測試一個控制器,但得到一個我無法解決的錯誤:S這個規範和控制器代碼有什麼問題?

這是我的規範代碼;

require 'spec_helper' 

describe BriefNotesController do 

    before(:all) do 
    @customer=Factory(:customer) 
    @project=Factory(:project_started, :owner => @customer) 
    end 

    context 'get :new' do 

    it 'should redirect to login page for not signed in users' do 
     get :new, :project_id => @project.id 
     response.should redirect_to("/kullanici-girisi") 
    end 

    it 'should be success and render new brief note page for project owner' do 
     sign_in @customer 
     get :new, :project_id => @project.id 
     response.should be_success 
    end 

    end 

end 

這是我的控制器代碼;

class BriefNotesController < ApplicationController 
    before_filter :authenticate_user! 
    before_filter :find_project 

    def new 
    @brief_note = @project.brief_notes.new 
    end 

    def create 
    @brief_note = @project.brief_notes.build(params[:brief_note]) 
    if @brief_note.save 
     redirect_to brief_project_path(@project) 
    else 
     render :action => :new 
    end 
    end 

private 
    def find_project 
    @project = current_user.projects.find_by_cached_slug([params[:project_id]]) 
    end 
end 

我覺得current_user.projects.find_by_cached_slug方法不起作用。所以這是錯誤;

Failures: 

    1) BriefNotesController get :new should be success and render new brief note page for   project owner 
Failure/Error: get :new, :project_id => @project.id 
NoMethodError: 
    undefined method `brief_notes' for nil:NilClass 
# ./app/controllers/brief_notes_controller.rb:6:in `new' 
# ./spec/controllers/brief_notes_controller_spec.rb:19:in `block (3 levels) in <top (required)>' 
+0

您是否使用舊版FactoryGirl? – jugglinghobo

+0

組:測試做 寶石「早該」 寶石「RSpec的護欄」,「〜> 2.11.0」 寶石「factory_girl_rails」 寶石「webrat」,「0.7.1」 結束所以沒有版本聲明 – user1609468

+0

我想[factory_girl](https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#using-factories)語法是錯誤的。但我不明白這可能會導致你的錯誤。 – jugglinghobo

回答

1

如果沒有關於模型的更多信息,我無法確定,但可能的罪魁禍首是您將@ project.id作爲請求參數傳遞,但是您正在通過cached_slug進行查找。嘗試@ project.to_param來代替。

+0

這不是我自己的代碼。我正在測試一個現有的項目:S – user1609468

+0

夠公平 - 我不是在評判你,只是爲你的測試建議一個可能的解決方案!如果它不清楚,我的意思是你應該改變'get:new,:project_id => @project.id'到'get:new,:project_id => @project.to_param' – gregates

+0

非常感謝:)你的建議對我的問題是完全正確的:) – user1609468

1

錯誤是從你find_project過濾器來:find_by_cached_slug返回一個零,分配給@project,並觸發時brief_notes被調用它(在new行動)的未定義的方法錯誤。

從你的規格描述我認爲它甚至不應該執行new代碼,而是重定向在authenticate_user!?我不使用自己的設計(這是一種設計方法,對吧?),所以我不確定這種方法的具體情況,但我認爲這就是您的問題來自何處。

我不認爲問題是你的FactoryGirl語法,它已被棄用,但應該仍然有效。

+0

authenticate_user!如果他是客戶,不要重定向用戶。 – user1609468