Escribiendo especificaciones para put a una ruta/modelo personalizado

Estoy trabajando en un plugin que añade un modelo. Estoy intentando escribir specs que prueben que el modelo (¿y el controlador?) se comportan como se espera.

Este código en una biblioteca de Ansible está PUTteando correctamente a esta ruta y actualizando un campo en el modelo/registro:

    headers = {
        'Api-Key': discourse_api_key,
        'Api-Username': discourse_api_username,
    }

    payload = {
        "server[request_status]": status
    }
    url = "%spfaffmanager/servers/%s" % (discourse_url, server_id)

    # raise Exception(url) 
    result = requests.put(url, data=payload, headers=headers)

Este es el spec que estoy intentando escribir para probar las actualizaciones en esa ruta. Estoy confundido porque tengo un millón de puts en el controlador y ninguno se está imprimiendo, aunque los puts en el modelo (por ejemplo, en una función llamada por before_save) sí aparecen en lo que veo en rake autospec.

Mi mejor suposición es que estoy fallando en:

# frozen_string_literal: true
require 'rails_helper'

describe Pfaffmanager::ServersController do
  fab!(:user) { Fabricate(:user) }
  fab!(:admin) { Fabricate(:admin) }
  fab!(:another_user) { Fabricate(:user) }
  fab!(:trust_level_2) { Fabricate(:user, trust_level: TrustLevel[2]) }
  before do
    Jobs.run_immediately!
  end

  it 'can update status' do
    request_status = 'new status'
    sign_in(admin)
    s=Pfaffmanager::Server.createServerFromParams(user_id: user.id,
        hostname: 'bogus.invalid' , request_status: 'not updated')
    puts "can update status created server id: #{s.id}"
    params = {server: {request_status: request_status}}
    
    expect {
        put "/pfaffmanager/servers/#{s.id}", params: params
    }.to change { s.request_status }
    expect(response.status).to eq(200)
    expect(s.request_status).to eq('new status')
  end
end

Ayer pasé casi todo el día con esto y agradecería cualquier pista sobre soluciones o técnicas para depurar.

Si s=Pfaffmanager::Server.createServerFromParams(user_id: user.id, hostname: 'bogus.invalid' , request_status: 'not updated') es el modelo que has creado, es posible que necesites fabricarlo para que la prueba de solicitud funcione correctamente, de manera similar a cómo se fabricaron los usuarios anteriormente en tu ejemplo.

Ah. ¿Entonces, fabricarlo en lugar de hacer un create real podría ser mi problema? En otras pruebas, por ejemplo, uso el código anterior para crear un Server y luego hago un get para obtener la lista de servidores y confirmar que existe un servidor con el nombre de host correcto y que se devuelve la cantidad correcta de servidores.

Sin embargo, probablemente tenga sentido averiguar cómo fabricarlo de la “forma correcta”.

Muchas gracias por tu ayuda. ¡Lo probaré la próxima vez!

¡He descubierto mi problema (o al menos uno de ellos)! Si hay errores en tu archivo model.rb, como algo que intente hacer algo así como variable_que_es_nil['xxx'], entonces el modelo falla pero no ves ningún error en los registros de las pruebas como sí verías en el registro de Rails si estuvieras “probando” con un navegador. Por lo tanto, puede parecer que el modelo o el controlador no se están llamando cuando en realidad sí lo están.

Pero de hecho escribí un Fabricator real, así que gracias por el empujón, @justin!