2 Stimmen

Rspec schlug bei der Aktualisierung im Controller fehl

Hier ist der rspec-Fehler für die Aktualisierung im Kunden-Controller:

 5) CustomersController GET customer page 'update' should be successful
     Failure/Error: put 'update', id => 1, :customer => {:name => 'name changed'}
       <Customer(id: integer, name: string, short_name: string, contact: string, address: string, country: string, phone: string, fax: string, email: string, cell:
string, sales_id: integer, test_eng_id: integer, safety_eng_id: integer, web: string, category1_id: integer, category2_id: integer, active: boolean, biz_status: str
ing, input_by_id: integer, quality_system: string, employee_num: string, revenue: string, note: text, user_id: integer, created_at: datetime, updated_at: datetime)
(class)> received :find with unexpected arguments
         expected: (1)
              got: ("1")
     # ./app/controllers/customers_controller.rb:44:in `update'
     # ./spec/controllers/customers_controller_spec.rb:41:in `block (3 levels) in <top (required)>'

Hier ist der rspec-Code:

it "'update' should be successful" do

  customer = mock_model(Customer) 
  Customer.should_receive(:find).with(1).and_return(customer)
  customer.stub(:update_attributes).and_return(true)    
  put 'update', :id => 1, :customer => {:name => 'name changed'}
  response.status.should == 302 #redirect()
end

Hier ist das Update im Controller:

  def update
    @customer = Customer.find(params[:id])
    if @customer.update_attributes(params[:customer], :as => :roles_new_update)
      if @customer.changed
        @message = 'The following info have been changed\n' + @customer.changes.to_s
        @subject ='Customer info was changed BY' + session[:user_name]
        notify_all_in_sales_eng(@message,@subject)
      end  

      redirect_to session[('page'+session[:page_step].to_s).to_sym], :notice => 'Customer was updated successfaully!'
    else
      render 'edit', :notice => 'Customer was not updated!'
    end
  end

Haben Sie eine Idee? Danke!

4voto

David Sulc Punkte 25766

Die gebuchten Werte (und der Zugriff über die params Hash) sind Zeichenketten. Der einfachste Weg, Ihren Test zu korrigieren, ist, dass Sie Customer.should_receive(:find).with("1").and_return(customer) .

Beachten Sie, dass jetzt "1" (d.h. ein String) als erwartetes Argument anstelle von 1 (eine FixNum) steht.

1voto

Gazler Punkte 81143

Alle Parameter werden als Zeichenketten übergeben und ich glaube, dass die Find-Methode eine implizite Umwandlung in eine Ganzzahl durchführt. Entweder machen Sie es explizit mit to_i im Controller oder ändern Sie Ihre Spezifikation, um die Zeichenfolge "1" zu erwarten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X