Escrevendo especificações para put em um caminho/modelo personalizado

Estou trabalhando em um plugin que adiciona um modelo. Estou tentando escrever specs que testem se o modelo (e o controller?) estão se comportando como esperado.

Este código em uma biblioteca do Ansible está fazendo PUT com sucesso para este caminho e atualizando um campo no 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)

Esta é a spec que estou tentando escrever para testar atualizações nesse caminho. Estou confuso porque tenho um milhão de puts no controller e nenhum deles está sendo impresso, embora os puts no modelo (por exemplo, em uma função chamada por before_save) apareçam no que vejo no rake autospec.

Minha melhor suposição é que estou errando na

# 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

Passei quase o dia todo nisso ontem e agradeceria qualquer dica sobre soluções ou técnicas para depuração.

Se s=Pfaffmanager::Server.createServerFromParams(user_id: user.id, hostname: 'bogus.invalid' , request_status: 'not updated') for o modelo que você criou, talvez seja necessário fabricá-lo para que o teste da solicitação funcione corretamente, de forma semelhante à maneira como os usuários foram fabricados anteriormente no seu exemplo.

Ah. Então, fabricá-lo em vez de realmente criar pode ser o meu problema? Nos outros testes, por exemplo, uso o código acima para criar um Server e depois faço um get para obter a lista de servidores e confirmar que existe um servidor com o nome de host correto e que o número correto de servidores é retornado.

Provavelmente faz sentido descobrir como fabricar um da maneira “correta”, no entanto.

Muito obrigado pela sua ajuda. Vou tentar isso na próxima!

Descobri meu problema (ou um deles, de qualquer forma). Se houver erros no seu arquivo model.rb, como algo que tente fazer algo como variable_that_is_nil['xxx'], o modelo falha, mas você não vê nenhum erro nos logs do spec, como veria no log do Rails se estivesse “testando” com um navegador. Então, pode parecer que o modelo ou o controlador não está sendo chamado, quando na verdade está.

Mas eu realmente escrevi um Fabricator de verdade, então obrigado pelo empurrão, @justin!