Patch :update / post :update 在测试 AMS 时中止
Patch :update / post :update aborted when testing AMS
当我尝试测试活动模型序列化程序时,我在尝试执行 补丁 :update 或 post 时遇到了一个问题:在 ActionController::TestCase 上更新。这是中止输出:
deovandski@deovandski-VirtualBox:~/Fakktion$ rake test
rake aborted!
SyntaxError: /home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:46: syntax error, unexpected '\n', expecting =>
/home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:54: syntax error, unexpected keyword_do_block, expecting keyword_end
/home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:58: syntax error, unexpected keyword_end, expecting end-of-input
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:244:in `rescue in load_dependency'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:237:in `load_dependency'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `block (3 levels) in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `each'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `block (2 levels) in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:113:in `each'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:113:in `block in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:20:in `invoke_rake_task'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/testing.rake:8:in `block in <top (required)>'
Tasks: TOP => test:run
(See full trace by running task with --trace)
下面是 Genres Controller 测试,只有相关测试用例。 Setup、Teardown 和所有其他测试都可以通过此 link.
找到
require 'test_helper'
class Api::V1::GenresControllerTest < ActionController::TestCase
test "API - Update a genre" do
genre = Genre.find_by name: 'test'
genre.name = "mikuchan"
patch :update, id: genre.id, ActiveModel::SerializableResource.new(genre).as_json
genreUpdated = Genre.find_by name: 'mikuchan'
assert_response :success, genreUpdated
end
end
根似乎是上面的 patch :update
行,因为中止表示意外的 /n 当它期待 =>。但是,当我删除 id: genre.id
时,出现了以下错误:
Api::V1::GenresControllerTest#test_API_-_Update_a_genre:
ActionController::UrlGenerationError: No route matches {:action=>"update", :controller=>"api/v1/genres", :data=>{:id=>"980190963", :type=>"genres", :attributes=>{:name=>"mikuchan", :eligibility_counter=>"0", :posts_count=>"0"}, :relationships=>{:posts=>{:data=>[]}}}}
test/controllers/api/v1/genres_controller_test.rb:46:in `block in <class:GenresControllerTest>'
上面的输出看起来像是一个正确的负载,所以问题似乎与语法有关。但是,我发现的唯一其他方法是使用 genre.save 这不是我想要的,因为此过程仅使用 ActiveRecord...
那么,在 AMS 上测试 post:update 的正确方法是什么?另外,如果我使用 :json_api 作为适配器,程序会改变吗?
这是一个语法问题,因为合适的语法是:
tempResource = ActiveModel::SerializableResource.new(resource).serializable_hash
post :update, tempResource.merge(id: resource)
这是对资源的 CREATE、SHOW、PATCH 和 DELETE 进行测试的示例:
require 'test_helper'
class Api::V1::GenresControllerTest < ActionController::TestCase
# Called before every test
setup do
@request.headers["Content-Type"] = "application/json; charset=utf-8"
@testGenre = Genre.new(name: 'TEST', eligibility_counter: 0, posts_count: 0)
@testGenre.save
end
# Called after test
def teardown
@testGenre = nil
@apiGenre = nil
@genreSerialized = nil
end
test "Genres - API - Get Index" do
get :index
assert_response_schema('genres/index.json')
end
test "Genres - API - Serializer Validation" do
sampleSenre = Genre.new
serializer = ActiveModel::Serializer.serializer_for(sampleSenre)
assert_equal GenreSerializer, serializer
end
test "Genres - API - Create 200" do
apiGenre = Genre.new(name: 'luka', eligibility_counter: 0, posts_count: 0)
assert_difference('Genre.count', +1) do
post :create, ActiveModel::SerializableResource.new(apiGenre).as_json
end
end
test "Genres - API - Create 422" do
post :create, ActiveModel::SerializableResource.new(@testGenre).as_json
assert_response(422)
end
test "Genres - API - SHOW 200" do
get :show, id: @testGenre
assert_response_schema('genres/show.json')
end
test "Genres - API - UPDATE 200" do
genre = Genre.find_by name: 'test'
genre.name = "mikuchan"
tempGenre = ActiveModel::SerializableResource.new(genre).serializable_hash
post :update, tempGenre.merge(id: genre)
genreUpdated = Genre.find_by name: 'mikuchan'
assert_response :success, genreUpdated
end
test "Genres - API - UPDATE 422" do
genre = Genre.find_by name: 'test'
genre1 = Genre.find_by name: 'movie'
genre.name = "mikuchan"
genre1.name = "mikuchan"
tempGenre = ActiveModel::SerializableResource.new(genre).serializable_hash
tempGenre1 = ActiveModel::SerializableResource.new(genre1).serializable_hash
post :update, tempGenre.merge(id: genre)
post :update, tempGenre1.merge(id: genre1)
assert_response(422)
end
test "Genres - API - DELETE 200" do
assert_difference('Genre.count', -1) do
delete :destroy, id: @testGenre
end
end
test "Genres - API - DELETE 422" do
genre = Genre.find_by name: 'song'
post = Post.first
post.genre = genre
post.save
delete :destroy, id: genre
assert_response(422)
end
end
当我尝试测试活动模型序列化程序时,我在尝试执行 补丁 :update 或 post 时遇到了一个问题:在 ActionController::TestCase 上更新。这是中止输出:
deovandski@deovandski-VirtualBox:~/Fakktion$ rake test
rake aborted!
SyntaxError: /home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:46: syntax error, unexpected '\n', expecting =>
/home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:54: syntax error, unexpected keyword_do_block, expecting keyword_end
/home/deovandski/Fakktion/test/controllers/api/v1/genres_controller_test.rb:58: syntax error, unexpected keyword_end, expecting end-of-input
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:244:in `rescue in load_dependency'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:237:in `load_dependency'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `block (3 levels) in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `each'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:114:in `block (2 levels) in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:113:in `each'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:113:in `block in define'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/sub_test_task.rb:20:in `invoke_rake_task'
/home/deovandski/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/test_unit/testing.rake:8:in `block in <top (required)>'
Tasks: TOP => test:run
(See full trace by running task with --trace)
下面是 Genres Controller 测试,只有相关测试用例。 Setup、Teardown 和所有其他测试都可以通过此 link.
找到require 'test_helper'
class Api::V1::GenresControllerTest < ActionController::TestCase
test "API - Update a genre" do
genre = Genre.find_by name: 'test'
genre.name = "mikuchan"
patch :update, id: genre.id, ActiveModel::SerializableResource.new(genre).as_json
genreUpdated = Genre.find_by name: 'mikuchan'
assert_response :success, genreUpdated
end
end
根似乎是上面的 patch :update
行,因为中止表示意外的 /n 当它期待 =>。但是,当我删除 id: genre.id
时,出现了以下错误:
Api::V1::GenresControllerTest#test_API_-_Update_a_genre:
ActionController::UrlGenerationError: No route matches {:action=>"update", :controller=>"api/v1/genres", :data=>{:id=>"980190963", :type=>"genres", :attributes=>{:name=>"mikuchan", :eligibility_counter=>"0", :posts_count=>"0"}, :relationships=>{:posts=>{:data=>[]}}}}
test/controllers/api/v1/genres_controller_test.rb:46:in `block in <class:GenresControllerTest>'
上面的输出看起来像是一个正确的负载,所以问题似乎与语法有关。但是,我发现的唯一其他方法是使用 genre.save 这不是我想要的,因为此过程仅使用 ActiveRecord...
那么,在 AMS 上测试 post:update 的正确方法是什么?另外,如果我使用 :json_api 作为适配器,程序会改变吗?
这是一个语法问题,因为合适的语法是:
tempResource = ActiveModel::SerializableResource.new(resource).serializable_hash
post :update, tempResource.merge(id: resource)
这是对资源的 CREATE、SHOW、PATCH 和 DELETE 进行测试的示例:
require 'test_helper'
class Api::V1::GenresControllerTest < ActionController::TestCase
# Called before every test
setup do
@request.headers["Content-Type"] = "application/json; charset=utf-8"
@testGenre = Genre.new(name: 'TEST', eligibility_counter: 0, posts_count: 0)
@testGenre.save
end
# Called after test
def teardown
@testGenre = nil
@apiGenre = nil
@genreSerialized = nil
end
test "Genres - API - Get Index" do
get :index
assert_response_schema('genres/index.json')
end
test "Genres - API - Serializer Validation" do
sampleSenre = Genre.new
serializer = ActiveModel::Serializer.serializer_for(sampleSenre)
assert_equal GenreSerializer, serializer
end
test "Genres - API - Create 200" do
apiGenre = Genre.new(name: 'luka', eligibility_counter: 0, posts_count: 0)
assert_difference('Genre.count', +1) do
post :create, ActiveModel::SerializableResource.new(apiGenre).as_json
end
end
test "Genres - API - Create 422" do
post :create, ActiveModel::SerializableResource.new(@testGenre).as_json
assert_response(422)
end
test "Genres - API - SHOW 200" do
get :show, id: @testGenre
assert_response_schema('genres/show.json')
end
test "Genres - API - UPDATE 200" do
genre = Genre.find_by name: 'test'
genre.name = "mikuchan"
tempGenre = ActiveModel::SerializableResource.new(genre).serializable_hash
post :update, tempGenre.merge(id: genre)
genreUpdated = Genre.find_by name: 'mikuchan'
assert_response :success, genreUpdated
end
test "Genres - API - UPDATE 422" do
genre = Genre.find_by name: 'test'
genre1 = Genre.find_by name: 'movie'
genre.name = "mikuchan"
genre1.name = "mikuchan"
tempGenre = ActiveModel::SerializableResource.new(genre).serializable_hash
tempGenre1 = ActiveModel::SerializableResource.new(genre1).serializable_hash
post :update, tempGenre.merge(id: genre)
post :update, tempGenre1.merge(id: genre1)
assert_response(422)
end
test "Genres - API - DELETE 200" do
assert_difference('Genre.count', -1) do
delete :destroy, id: @testGenre
end
end
test "Genres - API - DELETE 422" do
genre = Genre.find_by name: 'song'
post = Post.first
post.genre = genre
post.save
delete :destroy, id: genre
assert_response(422)
end
end