Quiero que el parche o la prueba de Rspec tengan éxito. También probé PostsContoroller antes de esto, y estoy desconcertado porque no obtuve el mismo error al probar PostsContoroller.
Failures: 1) Api::V1::PostItemsController update Update Content Failure/Error: patch :update, params: { post: post_params } ActionController::UrlGenerationError: No route matches {:action=>"update", :controller=>"api/v1/post_items", :post=>{:id=>1, :content=>"Update-Content", :status=>false, :post_id=>1}} # ./spec/controllers/post_items_spec.rb:11:in `block (3 levels) in <main>' Finished in 0.35529 seconds (files took 5.58 seconds to load) 5 examples, 1 failureFactoryBot
libro.rb
FactoryBot.define do factory :book, class: Post do sequence(:id) { |n| n} sequence(:title) { |n| "title#{n}" } sequence(:author) { |n| "author#{n}" } sequence(:image) { |n| "image#{n}"} end endcontenido.rb
FactoryBot.define do factory :content, class: PostItem do sequence(:id) { |n| n } sequence(:content) { |n| "list#{n}"} sequence(:status) { false } end endEspecificaciones
post_items_spec.rb
require 'rails_helper' RSpec.describe Api::V1::PostItemsController, type: :controller do describe 'update' do it 'Update Content' do book = create(:book) content = create(:content, post_id: book.id) post_params = { id: content.id, content: 'Update-Content', status: false, post_id: book.id } patch :update, params: { post: post_params } json = JSON.parse(response.body) expect(response.status).to eq(200) expect(json['Update-Content']).to eq('Update-content') end end endRutas
**Rails.application.routes.draw do namespace :api do namespace :v1 do resources :posts resources :post_items end end endLos equipos de Rails y RSpec desaconsejan el uso de especificaciones de controlador y lo han hecho durante mucho tiempo. En su lugar, debería escribir una especificación de solicitud que envíe solicitudes HTTP reales.
RSpec.describe 'Api V1 Post items', type: :request do let(:book) { create(:book) } describe "PATCH /api/v1/books" do context "with valid parameters" do subject do patch api_v1_post_item_path(book), params: { content: 'Update-Content' } end it { should be_successful } it "updates the content" do # refresh the record from the db expect { book.reload }.to change(book, :title).to('Update-Content') end it "includes the updated entity in the response body" do expect(response.parsed_body['content']).to eq 'Update-Content' end end # @todo write specs with invalid parameters # @todo write specs for authentication and authorization end end Otro problema es que está generando identificaciones en su fábrica. No hagas esto nunca. Cuando realmente persiste en los registros, la base de datos asignará identificaciones automáticamente. Cuando use build_stubbed , FactoryBot creará una identificación simulada. El uso de una secuencia para generar ID invita a malas prácticas, como codificar ID en una especificación, y solo le causará dolores de cabeza.
Si realmente desea salvar esa especificación del controlador, el error de enrutamiento se debe al hecho de que le falta el parámetro ID, ya que lo está llamando como patch :update, params: { post: post_params } el parámetro id está enterrado en params[:post][:id] . Así que quieres patch :update, params: { id: post.id, post: post_params } , no recomiendo esto: utiliza el programa y escribe pruebas de prueba futuras que no permitan que se escapen todos los errores.