2011-12-18 14 views
9

To powinno być proste, ale po prostu nie można było znaleźć przyczyny niepowodzenia testu. Wystąpił następujący błąd podczas uruchamiania programu rspec. Ale po komentowaniu metody "wyślij" wszystko działa dobrze.Uzyskaj błędną liczbę argumentów (2 za 0) podczas uruchamiania testu Rspec za pomocą polecenia get i delete

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 

Kod modelu

class Message 
    include Mongoid::Document 
    belongs_to :target_app 
end 

kod kontrolera

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 

Odpowiedz

22

Każdy obiekt w Ruby ma metodę wysyłania:

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

Nazywając działania „wyślij” ty spowodował konflikt nazw. Spróbuj zmienić nazwę tej akcji, aby "wysłać wiadomość" lub zdefiniować ją w inny sposób. Powinien istnieć sposób, aby "wysłać" w swojej mapie URL do akcji o nazwie "sendmessage".

+0

Dzięki, David. Zmiana akcji na inne prace nazw. – CCK

+0

Inną nazwą, której należy unikać, jest "proces". – Mika

3

Kilka rzeczy jest z tym nie tak.

Pierwsza is what David Grayson pointed out. Nie możesz wywołać metody send.

Drugi, to jak już określono, że działania w twojej config/routes.rb, to nie powinno być tak:

resources :messages do 
    member 'send' 
end 

Jako że nie jest zdefiniowanie działań w ogóle. Właściwie nie jestem nawet pewien, co to oznacza. Powinno być to (biorąc pod uwagę, nie można nazwać send a):

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

Aby uzyskać więcej informacji, zobacz Routing guide.

Trzecią rzeczą, którą robisz źle jest to, że w teście musisz odwołać się do akcji kontrolera i nie korzystać z trasy. Dzieje się tak, ponieważ piszesz test kontrolera funkcjonalnego, który testuje kontroler.

Nie powinno być tak:

get target_app_messages_path(message.target_app.id) 

Ale raczej to:

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

Metoda podejmuje działanie jako pierwszy argument, parametry jako argumentu i sesji danych drugich jako trzeci argument.

+0

Dzięki, Ryan. Próbowałem "get: dostarczyć,: id => message.target_app.id". Ale dał mi ten błąd "zła argumentacja (oczekiwany obiekt URI lub ciąg URI)". Jakiekolwiek myśli? A ponieważ używam zasobów zagnieżdżonych, w jaki sposób mogę przekazać identyfikator target_app do metody "get". – CCK

+0

Nie mogę debugować tego błędu bez śledzenia stosu. Czy możesz to powiedzieć? –

+0

Nie powinno to być po prostu 'get: dostarcz,: id => message.id' - dlaczego potrzebujesz' target_app.id', gdy wiadomość już istnieje i ma swój własny identyfikator. – nmott

Powiązane problemy