RSpec路线识别

时间:2012-06-04 07:37:36

标签: ruby-on-rails ruby rspec

我有一个有趣的情况让我挠头。 我创建了一个控制器(没有模型)来生成密码重置。我已经定义了一个到控制器的RESTful路由:

的routes.rb

resources :password_resets

我在控制器上创建了一些操作,特别是我的编辑操作:

password_resets_controller.rb

class PasswordResetsController < ApplicationController
  # code omitted
  def edit
    @user = User.find_by_password_reset_token!(params[:id])
  end
  # code omitted
end

用户可以通过我发送给用户的电子邮件访问编辑内容:

password_reset.html.haml

%p To reset your password, click the URL below.
= edit_password_reset_url(@user.password_reset_token)

到目前为止,我已经成功使用了代码。 然后我有测试我的邮件的规范:

  describe "password reset" do
    let(:user) { FactoryGirl.create(:user) }
    let(:mail) { UserMailer.password_reset(user) }

    it "sends user password reset url" do
      mail.to.should eq([user.email])
    end
  end

令人惊讶的是,我得到以下内容:

 Failure/Error: let(:mail) { UserMailer.password_reset(user) }
 ActionView::Template::Error:
   No route matches {:action=>"edit", :controller=>"password_resets"}
 # ./app/views/user_mailer/password_reset.html.haml:5:in `_app_views_user_mailer_password_reset_html_haml__1760284087840822602_11954840'
 # ./app/mailers/user_mailer.rb:7:in `password_reset'

然而,有一个路线匹配,至少通过查看我的路线:

 password_resets GET    /password_resets(.:format)             password_resets#index
                       POST   /password_resets(.:format)             password_resets#create
    new_password_reset GET    /password_resets/new(.:format)         password_resets#new
   edit_password_reset GET    /password_resets/:id/edit(.:format)    password_resets#edit
        password_reset GET    /password_resets/:id(.:format)         password_resets#show
                       PUT    /password_resets/:id(.:format)         password_resets#update
                       DELETE /password_resets/:id(.:format)         password_resets#destroy

我的测试/路线可能出现什么问题?

非常感谢。

1 个答案:

答案 0 :(得分:4)

检查工厂user是否有password_reset_token。最有可能是nil,您可以为任何edit_something_url(nil)

获得相同的路由错误