2014-09-12 77 views
0

我正在嘗試控制器測試,並與此,嘲笑和存根。但是,我認爲我能得到後者,但是,在我的測試中沒有那麼自信,我不願意對目前我要解釋的失敗測試抱有信心。rspec中的stubbing控制器

RSpec.describe CorporateContactFormsController, :type => :controller do 
    let!(:contact_form){ FactoryGirl.create :corporate_contact_form } 
    let!(:params_new){ {corporate_contact_form: {}} } 

    describe "POST create" do 
    before do 
     CorporateContactForm.stub(:new).and_return(contact_form) 
     get :new, params_new 
    end 

    it "returns http success" do 
     expect(response).to be_success 
    end 
    end 
    describe "POST create" do 
    before do 
     CorporateContactForm.stub(:new).and_return(contact_form) 
    end 
    describe "where all is good" do 
     before do 
     contact_form.stub(:save).and_return(true) 
     post 'create', params_new 
     end 
     it "should set a flash notice" do 
     flash[:notice].should_not be_nil 
     end 
     it "should redirect to edit_details page" do 
     response.should redirect_to employees_path 
     end 
    end 
    end 

end 

所以,我在這裏測試處理表單提交的控制器。但這裏是我輸了...

def create 
    if corporate_contact_form_params.present? 
     @contact_form = CorporateContactForm.new(corporate_contact_form_params) 
     if @contact_form.save 
     if @contact_form.contact_type == CorporateContactForm::EMPLOYEE 
      redirect_to employees_path 
     else 
      redirect_to employers_path 
     end 
     flash[:notice] = 'Form submitted' 
     return 
     end 
    end 
    render new 
    end 

    private 

    def corporate_contact_form_params 
    params.require(:corporate_contact_form).permit(:firstname, :surname, :contact_number, :email, :company_name, :method_of_payment, :number_of_employees, :comments, :contact_type) 
    end 

利用如上設置我的參數,我得到的失敗測試

Failure/Error: post 'create', params_new 
    ActionController::ParameterMissing: 
     param is missing or the value is empty: corporate_contact_form 

我真的很努力明白是怎麼回事,爲什麼要這樣測試失敗,因爲它的工作在開發中。爲什麼第一個describe "POST create測試通過,而不是下一個塊?

回答

1

錯誤消息是明確的:param is missing or the value is empty: corporate_contact_form。您在corporate_contact_form密鑰下傳遞的值爲空,require對此不滿意。試着改變你的let!(應該是let,貪婪加載在這種情況下過時的)某事物,如:

let!(:params_new){ {corporate_contact_form: { firstname: ''} } } 

編輯:

這是怎麼require方法定義:

def require(key) 
    value = self[key] 
    if value.present? || value == false 
    value 
    else 
    raise ParameterMissing.new(key) 
    end 
end 

present方法爲空散列返回false。

+0

這太棒了,它工作。我不確定爲什麼,但我想通過只給空白的大括號,我顯示空白參數。爲什麼這個工作? – 2014-09-12 11:12:07

+0

@FredBenfield - 解釋。 :) – BroiSatse 2014-09-12 11:38:03