Rspec控制器测试中未定义的方法route_name

时间:2015-09-13 03:18:50

标签: ruby-on-rails ruby rspec

运行我的控制器测试时,出现此错误:

NoMethodError:
   undefined method `api_challenge_url' for #<Api::V1::ChallengesController:0x007f829b233460>

实际上,这不是存在的路线。我的路线文件如下所示:

namespace :api, { format: :json, constraints: { subdomain: 'api' }, path: '/'}  do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
  resources :users, only: [:show, :create, :update, :destroy] do
    resources :challenges, only: [:create, :show]
  end
 end
end

我的控制器测试看起来像这样:

RSpec.describe Api::V1::ChallengesController, type: :controller do

describe "POST #create" do
 context "when successfully created" do

  before(:each) do
    @user = FactoryGirl.create(:user)
    @challenge_attributes = FactoryGirl.attributes_for(:challenge)
    post :create, user_id: @user.id, challenge: @challenge_attributes, format: :json
  end

  it "should render the JSON for the created challenge" do
    challenge_response = JSON.parse(response.body, symbolize_names: true)
    expect challenge_response[:description].to eql @challenge_attributes["description"]
    expect challenge_response[:title].to eql @challenge_attributes["title"]
  end
 end
end

end

但是对于我的生活,我不知道为什么它会拨打错误的路线名称。 rake routes的相关部分的输出如下所示:

api_user_challenges POST   /users/:user_id/challenges(.:format)     api/v1/challenges#create {:subdomain=>"api"}

我在post方法中尝试了几种不同的格式,是否有一些惯用的方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

尝试添加一些配置以将url助手包含到您的测试套件中:

RSpec.configure do |c|
  c.include Rails.application.routes.url_helpers
  # Other configurations ...
end

如果您希望xxx_url使用xxx_path,请记住在action_controller.default_url_options中配置config/environments/test.rb,例如:

config.action_controller.default_url_options = {
  host: 'www.mysite.org',
  protocol: 'https'
}