Получить неправильное количество аргументов (2 для 0) при запуске Rspec Test с использованием get и delete - PullRequest
9 голосов
/ 18 декабря 2011

Это должно быть просто, но просто не мог понять, почему это привело к неудаче тестирования. Я продолжал получать следующую ошибку при запуске rspec. Но после комментирования метода send все работает нормально.

  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

Код модели

class Message
  include Mongoid::Document
  belongs_to :target_app
end

Код контроллера

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

  ...

  def send
    ...
  end
end

/ спецификации / запросы / 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

Ответы [ 2 ]

22 голосов
/ 18 декабря 2011

У каждого объекта в Ruby есть метод отправки:

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

.действие "отправить" вызвало конфликт имен.Попробуйте переименовать это действие в «sendmessage» или определить его другим способом.Должен быть способ иметь «send» в вашей карте URL для действия с именем «sendmessage».

3 голосов
/ 18 декабря 2011

Несколько вещей не так с этим.

Первый - это то, на что указал Дэвид Грейсон .Вы не можете вызвать метод send.

Во-вторых, как вы определили это действие в вашем config/routes.rb, оно не должно быть таким:

resources :messages do
  member 'send'
end

Как это нене определяет действие вообще.На самом деле, я даже не уверен, что это делает.Это должно быть так (учитывая, что вы также не можете назвать это send):

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

Для получения дополнительной информации см. Руководство по маршрутизации .

Третье, что вы делаете неправильно, заключается в том, что в своем тесте вам нужно ссылаться на действие для контроллера, а не использовать маршрут.Это потому, что вы пишете тест функционального контроллера, который тестирует контроллер.

Это не должно быть так:

get target_app_messages_path(message.target_app.id)

Скорее, это:

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

Метод принимает действие в качестве первого аргумента, параметры в качестве второго аргумента и данные сеанса в качестве третьего аргумента.

...