2012-06-04 78 views
1

我有一個有趣的情況,讓我撓了撓頭。 我創建了一個控制器(沒有模型)來生成密碼重置。我定義到控制器REST風格的路線:RSpec路線識別

的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 

用戶可以從電子郵件地址T I發送給用戶:

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 

我的測試/路線中可能出現什麼問題?

非常感謝。

回答

4

檢查工廠user是否有password_reset_token。最有可能它是零,相同的路由錯誤,你可以得到任何edit_something_url(nil)

+0

這確實是發生了什麼!來自RSpec的混淆錯誤消息,但嘿,現在我知道了。非常感謝你! – alexs333