Scrittura delle specifiche per put su un percorso/modello personalizzato

Sto lavorando su un plugin che aggiunge un modello. Sto cercando di scrivere degli spec per verificare che il modello (e il controller?) si comportino come previsto.

Questo codice in una libreria ansible sta effettuando con successo una richiesta PUT a questo percorso e aggiornando un campo nel modello/record:

    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)

Questo è lo spec che sto cercando di scrivere per testare gli aggiornamenti su quel percorso. Sono confuso perché ho un’infinità di puts nel controller e nessuno di questi viene stampato, mentre i puts nel modello (ad esempio, in una funzione chiamata da before_save) compaiono in ciò che vedo in rake autospec.

La mia migliore ipotesi è che stia sbagliando qualcosa con

# 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

Ho passato praticamente tutta la giornata di ieri su questo e apprezzerei qualsiasi suggerimento su soluzioni o tecniche per il debugging.

Se s=Pfaffmanager::Server.createServerFromParams(user_id: user.id, hostname: 'bogus.invalid' , request_status: 'not updated') è il modello che hai creato, potresti doverlo simulare per far funzionare correttamente il test della richiesta, in modo simile a come gli utenti sono stati simulati in precedenza nel tuo esempio.

Oh. Quindi, fabbricarlo invece di eseguire un vero create potrebbe essere il mio problema? Negli altri test, ad esempio, uso il codice sopra per creare un Server e poi eseguo un get per ottenere l’elenco dei server e confermare che esista un server con il nome host corretto e che venga restituito il numero corretto di server.

Tuttavia, probabilmente ha senso capire come fabbricarlo nel modo “giusto”.

Grazie mille per il tuo aiuto. Proverò questo la prossima volta!

Ho capito il mio problema (o almeno uno di essi). Se nel tuo file model.rb ci sono errori, come qualcosa che tenta di eseguire operazioni del tipo variable_that_is_nil['xxx'], il modello fallisce, ma non vedi errori nei log degli spec come faresti nel log di Rails se stessi “testando” con un browser. Quindi può sembrare che il modello o il controller non vengano chiamati, quando in realtà lo sono.

Comunque ho effettivamente scritto un vero Fabricator, quindi grazie per la spinta, @justin!