2015-09-07 64 views
1

我有一些困難讓所有的RESTful路線設置正確。到目前爲止,我已經在我的應用程序中採用了最簡單的步驟。新控制器 - 沒有路線匹配更新,編輯,顯示或銷燬

  1. 創建新的Rails應用
  2. 創建REST風格的動作新控制器
  3. 添加resourcesroutes.rb

然而4了我7個的行動失敗的默認測試。任何人都可以解釋爲什麼?

rails generate controller Employees new create update edit destroy index show 

下面是相應的控制器,employees_controller.rb

class EmployeesController < ApplicationController 
    def new 
    end 

    def create 
    end 

    def update 
    end 

    def edit 
    end 

    def destroy 
    end 

    def index 
    end 

    def show 
    end 
end 

現在我的資源添加到routes.rb

Rails.application.routes.draw do 

    resources :employees 

end 

所有路由都似乎是有根據的rake routes

輸出
 Prefix Verb URI Pattern     Controller#Action 
    employees GET /employees(.:format)   employees#index 
       POST /employees(.:format)   employees#create 
new_employee GET /employees/new(.:format)  employees#new 
edit_employee GET /employees/:id/edit(.:format) employees#edit 
    employee GET /employees/:id(.:format)  employees#show 
       PATCH /employees/:id(.:format)  employees#update 
       PUT /employees/:id(.:format)  employees#update 
       DELETE /employees/:id(.:format)  employees#destroy 

但現在當我運行默認的測試中,我得到的4個錯誤:

# Running: 

.EEEE.. 

Finished in 0.267712s, 26.1475 runs/s, 11.2061 assertions/s. 

    1) Error: 
EmployeesControllerTest#test_should_get_update: 
ActionController::UrlGenerationError: No route matches {:action=>"update",  :controller=>"employees"} 
    test/controllers/employees_controller_test.rb:15:in `block in <class:EmployeesControllerTest>' 


    2) Error: 
EmployeesControllerTest#test_should_get_destroy: 
ActionController::UrlGenerationError: No route matches {:action=>"destroy", :controller=>"employees"} 
    test/controllers/employees_controller_test.rb:25:in `block in <class:EmployeesControllerTest>' 


    3) Error: 
EmployeesControllerTest#test_should_get_show: 
ActionController::UrlGenerationError: No route matches {:action=>"show",  :controller=>"employees"} 
    test/controllers/employees_controller_test.rb:35:in `block in <class:EmployeesControllerTest>' 


    4) Error: 
EmployeesControllerTest#test_should_get_edit: 
ActionController::UrlGenerationError: No route matches {:action=>"edit", :controller=>"employees"} 
    test/controllers/employees_controller_test.rb:20:in `block in <class:EmployeesControllerTest>' 

7 runs, 3 assertions, 0 failures, 4 errors, 0 skips 

最後,這裏是employees_controller_test.rb內容。正如我所說的,這些是Rails在生成控制器時自動創建的默認測試。

require 'test_helper' 

class EmployeesControllerTest < ActionController::TestCase 
    test "should get new" do 
    get :new 
    assert_response :success 
    end 

    test "should get create" do 
    get :create 
    assert_response :success 
    end 

    test "should get update" do 
    get :update 
    assert_response :success 
    end 

    test "should get edit" do 
    get :edit 
    assert_response :success 
    end 

    test "should get destroy" do 
    get :destroy 
    assert_response :success 
    end 

    test "should get index" do 
    get :index 
    assert_response :success 
    end 

    test "should get show" do 
    get :show 
    assert_response :success 
    end 

end 
+0

你可以顯示什麼'employees_controller_test.rb'看起來像? – dimakura

+0

是的,我已經知道了:)看到答案 – dimakura

回答

0

根據dimakura的回答,你必須改變一些線路在您的測試

的更新方法是put(或在rails4局部變化的patch

test "should get update" do 
    put :update 
    assert_response :success 
    end 

,併爲您的編輯,刪除並顯示路由,id缺失

test "should get edit" do 
    get :edit, id: 2 
    assert_response :success 
    end 
+0

我可能失敗的測試失敗,因爲我實際上沒有僱員表中的任何成員呢?顯示,更新,編輯和銷燬似乎需要至少一個表上的成員來操作,對吧? – hobscrk777

+0

@ user3325401你不需要數據庫中的任何對象。你可以存根或模擬對象(我使用rspec進行測試)。但是你的編輯路徑看起來像'/ product/1/edit',爲此你需要一個id – rob

+0

非常感謝!最後得到所有7個測試通過! – hobscrk777

0

你的控制器測試大概是這樣的:

class EmployeesControllerTest < ActionController::TestCase 
    test "should get create" do 
    get :create 
    assert_response :success 
    end 

    # other tests not shown 

你應該把它改成這樣:

class EmployeesControllerTest < ActionController::TestCase 
    test "should get create" do 
    post :create 
    assert_response :success 
    end 

    # other tests should be changed accordingly 
end 

使用patchupdateput方法,並deletedelete行動。

+1

有趣!正如你可能猜到的那樣,我是一個Rails初學者,所以讓我在這裏大聲思考....看起來你只是將'get'改爲'post'?爲什麼自動創建的測試會使用不正確的方法 - 或者如果不是不正確的,至少會導致測試失敗的方法? – hobscrk777

+0

自動創建不知道你的意思:)如果你想模型+控制器+用正確的方法創建的測試,那麼你應該可能生成'rails g scaffold Employee ...' – dimakura

+0

那麼我只是改變了發佈的更新測試,但仍然失敗。創建操作確實通過了測試。 – hobscrk777