2011-12-18 5 views
9

Esto debería ser simple, pero simplemente no pudo descubrir por qué causó la falla en la prueba. Recibí el siguiente error al ejecutar rspec. Pero después de comentar el método "enviar", todo funciona bien.Obtenga el número incorrecto de argumentos (2 para 0) cuando ejecute la prueba Rspec usando get y elimine

1) Messages GET /messages works! (now write some real specs) 
    Failure/Error: get target_app_messages_path(@message.target_app.id) 
    ArgumentError: 
     wrong number of arguments (2 for 0) 
    # ./app/controllers/messages_controller.rb:37:in `send' 

routes.rb

resources :target_apps do 
    resources :messages do 
    member do 
    post 'send' 
    end 
    end 
end 

Código Modelo

class Message 
    include Mongoid::Document 
    belongs_to :target_app 
end 

Código controlador

class MessagesController < ApplicationController 
    def index 
    ... 
    end 
    def show 
    ... 
    end 

    ... 

    def send 
    ... 
    end 
end 

/spec/requests/message_spec.rb

describe "Messages" do 
    describe "GET /messages" do 

    let(:message) do 
    FactoryGirl.create(:message) 
    end 

    it "works! (now write some real specs)" do 
    # Run the generator again with the --webrat flag if you want to use webrat methods/matchers 
    get target_app_messages_path(message.target_app.id) 
    response.status.should be(200) 
    end 
end 

Respuesta

22

Cada objeto en Ruby tiene un método de envío:

http://ruby-doc.org/core-1.9.3/Object.html

Al nombrar a su acción "enviar" que causó un conflicto de nombres. Intente cambiar el nombre de esa acción para "enviar mensaje" o definirlo de una manera diferente. Debería haber una forma de "enviar" en su mapa de URL a una acción llamada "sendmessage".

+0

Gracias, David. Cambiar la acción a otro nombre funciona. – CCK

+0

Otro nombre de acción para evitar es 'proceso'. – Mika

3

Un par de cosas están mal con esto.

El primer is what David Grayson pointed out. No puedes llamar a un método de envío.

El segundo, es como se ha definido que la acción en su config/routes.rb, no debe ser este:

resources :messages do 
    member 'send' 
end 

Como que no es la definición de una acción en absoluto. De hecho, ni siquiera estoy seguro de lo que eso hace. Debe ser esto (teniendo en cuenta que no se puede llamar así send):

resources :messages do 
    member do 
    get 'deliver' 
    end 
end 

Para obtener más información, consulte la Routing guide.

Lo tercero que está haciendo mal es que en su prueba, necesita hacer referencia a la acción del controlador y no usar la ruta. Esto se debe a que está escribiendo una prueba de controlador funcional que prueba un controlador.

No debería ser esta:

get target_app_messages_path(message.target_app.id) 

Pero en lugar, esto:

get :deliver, :id => message.target_app.id 

El método toma la acción como primer argumento, parámetros como los segundos datos de argumentos y de sesión como el tercer argumento.

+0

Gracias, Ryan. Intenté "get: deliver,: id => message.target_app.id". Pero me dio este error "argumento malo (objeto URI esperado o cadena URI)". ¿Cualquier pensamiento? Y dado que estoy usando recursos anidados, ¿cómo podría pasar ID de target_app al método "get"? – CCK

+0

No puedo depurar ese error sin stacktrace. ¿Podrías por favor decirlo? –

+0

¿No debería ser 'get: deliver,: id => message.id' - por qué necesita' target_app.id' cuando el mensaje ya existe y tiene una identificación propia. – nmott

Cuestiones relacionadas