2013-11-25 4 views
0

Теперь я делаю тест Rspec для users_controller.rb. Однако у меня проблема с ошибкой NoMethodError: undefined method 'user_url', как следует.Пользовательский контроллер Rspec - NoMethodError: undefined method 'user_url'

FF 

Failures: 

1) UsersController PUT update user update does not succeed 
Failure/Error: put :update, {:id => user.to_param}, valid_session, :user_route => user 
NoMethodError: 
    undefined method `user_url' for #<UsersController:0x52e40e0> 
# ./app/controllers/users_controller.rb:21:in `block (2 levels) in update' 
# ./app/controllers/users_controller.rb:18:in `update' 
# ./spec/controllers/users_controller_spec.rb:64:in `block (3 levels) in <top  (required)>' 

2) UsersController PUT update user update succeeds 
Failure/Error: put :update, {:id => user.to_param}, valid_session, :user_route => user 
NoMethodError: 
    undefined method `user_url' for #<UsersController:0x53bc560> 
# ./app/controllers/users_controller.rb:21:in `block (2 levels) in update' 
# ./app/controllers/users_controller.rb:18:in `update' 
# ./spec/controllers/users_controller_spec.rb:58:in `block (3 levels) in <top (required)>' 

Finished in 0.679 seconds 
2 examples, 2 failures 

Failed examples: 

rspec ./spec/controllers/users_controller_spec.rb:61 # UsersController PUT update user update does not succeed 
rspec ./spec/controllers/users_controller_spec.rb:56 # UsersController PUT update user update succeeds 

Randomized with seed 33412 

users_controller.rb

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @user } 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 

     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "user#edit" } 
     format.json { render json: @idea.errors, status: :unprocessable_entity } 
    end 
    end 
end 
end 

Кроме того, здесь мой Rspec users_controller_spec.rb. Я сделал два теста о «обновлении POST». Один из них - для успешного обновления. Другой - для того, чтобы не обновляться. (О последнем я положил окурок User.stub(:update_attribute).and_return(false), который я ожидал, что «update_attribute» возвращает «ложь», так что процесс переходит к «другой».)

require 'spec_helper' 

describe UsersController do 

    let(:valid_attributes) { { 
    "email" => "[email protected]", 
    "password" => "12345678" 
    } } 

    def valid_session 
    {} 
    end 

    describe "PUT update" do 
    it "user update succeeds" do 
     user = User.create! valid_attributes 
     put :update, {:id => user.to_param}, valid_session 
     assigns(:user).should eq(user) 
    end 
    it "user update does not succeed" do 
     user = User.create! valid_attributes 
     User.stub(:update_attribute).and_return(false) 
     put :update, {:id => user.to_param}, valid_session 
     assigns(:user).should eq(user) 
     response.should render_template("edit") 
    end 
    end 
end 

Я понятия не имею, чтобы решить эту проблему, потому что я не могу понять где user_url действительно пришел. Поэтому я хотел бы помочь.

ответ

2

Когда вы используете redirect_to @user, рельсы отправляют этот запрос UsersController#show, но он делает это, позвонив по номеру user_url(@user). Если бы я должен был догадаться, вы, вероятно, не имеют строку, которая определяет user_url:

resources :users 

в файле routes.rb. Это автоматически создаст именованный маршрут user_url, что ваш контроллер Реферирование с redirect_to @user

В качестве альтернативы, вы можете определить маршрут самостоятельно в файле routes.rb так:

get "https://stackoverflow.com/users/show" => "users#show", as: :user 

Но это на самом деле не в «Rails -y 'способ сделать это. В любой момент вы можете запустить команду rake routes в терминале, чтобы увидеть все указанные вами маршруты в файле routes.rb. Если user не существует, вам необходимо определить его, как я уже упоминал выше.

Более подробная информация по названным маршрутам здесь: http://guides.rubyonrails.org/routing.html#singular-resources

1

Если вы используете разработать затем проверить, если следующий метод возвращает ничего.

def after_sign_in_path_for(resource) 

в application_controller.rb

Если метод не возвращает ничего, вы получите сообщение об ошибке:

неопределенный метод `user_url» для #

Я также в конечном итоге удаление

stored_location_for(resource) 

в after_sign_in_path_for (ресурс), потому что это было причинно бесконечный цикл. Подробнее см. В этом ответе.

rails:3 Devise signup Filter chain halted as :require_no_authentication rendered or redirected

Смежные вопросы