Mam pewne trudności z poprawnym ustawieniem wszystkich tras RESTful. Dotychczas wykonałem najprostsze proste kroki w mojej aplikacji.
- Utwórz nową aplikację do szyn
- Utwórz nowy kontroler za pomocą akcji RESTful
- Dodaj
resources
doroutes.rb
A jednak 4 z moich 7 działań nie spełniają testów domyślnych. Czy ktoś może wyjaśnić dlaczego?
rails generate controller Employees new create update edit destroy index show
A oto odpowiedni kontroler, 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
Teraz dodam zasoby do routes.rb
Rails.application.routes.draw do
resources :employees
end
Wszystkie trasy wydają się być tam, w oparciu o wyjście 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
Ale teraz, gdy uruchamiam testy domyślne, otrzymuję 4 błędy:
# 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
Wreszcie, oto treść employees_controller_test.rb
. Jak powiedziałem, są to domyślne testy tworzone automatycznie przez Railsy po wygenerowaniu kontrolera.
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
Odpowiedzi:
0 dla odpowiedzi № 1zgodnie z odpowiedzią dimakury musisz zmienić niektóre trasy w teście
metoda aktualizacji to a put
(lub patch
za częściowe zmiany w szynach4)
test "should get update" do
put :update
assert_response :success
end
a do edycji, usuwania i pokazywania tras, id
brakuje
test "should get edit" do
get :edit, id: 2
assert_response :success
end
0 dla odpowiedzi nr 2
Twój test kontrolera prawdopodobnie wygląda:
class EmployeesControllerTest < ActionController::TestCase
test "should get create" do
get :create
assert_response :success
end
# other tests not shown
koniec
Powinieneś to zmienić na:
class EmployeesControllerTest < ActionController::TestCase
test "should get create" do
post :create
assert_response :success
end
# other tests should be changed accordingly
end
Posługiwać się patch
lub put
metoda dla update
, i delete
dla delete
działania.