Rédaction des spécifications pour put vers un chemin/modèle personnalisé

Je travaille sur un plugin qui ajoute un modèle. J’essaie d’écrire des spécifications pour tester que le modèle (et le contrôleur ?) se comportent comme prévu.

Ce code, situé dans une bibliothèque Ansible, effectue avec succès une requête PUT vers ce chemin et met à jour un champ dans le modèle/enregistrement :

    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)

Voici la spécification que j’essaie d’écrire pour tester les mises à jour vers ce chemin. Je suis confus car j’ai des milliers de puts dans le contrôleur et aucun ne s’affiche, alors que les puts dans le modèle (par exemple, dans une fonction appelée par before_save) apparaissent bien dans les logs que je vois avec rake autospec.

Ma meilleure hypothèse est que je fais une erreur dans

# 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

J’ai passé presque toute la journée d’hier sur ce problème et j’apprécierais toute indication sur des solutions ou des techniques de débogage.

Si s=Pfaffmanager::Server.createServerFromParams(user_id: user.id, hostname: 'bogus.invalid', request_status: 'not updated') est le modèle que vous avez créé, vous devrez peut-être le fabriquer pour que le test de requête fonctionne correctement, de la même manière que les utilisateurs ont été fabriqués précédemment dans votre exemple.

Ah. Donc, le fait de fabriquer l’objet plutôt que de procéder à une véritable création pourrait être la source de mon problème ? Dans les autres spécifications, par exemple, j’utilise le code ci-dessus pour créer un Server, puis j’effectue une requête get pour obtenir la liste des serveurs et vérifier qu’un serveur avec le nom d’hôte approprié existe bien et que le bon nombre de serveurs est renvoyé.

Cependant, il est probablement plus judicieux de déterminer comment fabriquer un objet de la « bonne » manière.

Merci beaucoup pour votre aide. Je vais essayer cela la prochaine fois !

J’ai résolu mon problème (ou l’un d’eux, en tout cas). Si vous avez des erreurs dans votre fichier model.rb, comme quelque chose qui tente d’exécuter variable_qui_est_nil['xxx'], alors le modèle échoue, mais vous ne voyez aucune erreur dans les journaux des tests comme vous le feriez dans le journal Rails si vous testiez avec un navigateur. Cela peut donc sembler que le modèle ou le contrôleur n’est pas appelé alors qu’il l’est bel et bien.

Mais j’ai effectivement écrit un vrai Fabricator, alors merci pour la poussée, @justin !