Написание спецификаций для put в пользовательский путь/модель

Я работаю над плагином, который добавляет модель. Я пытаюсь написать спецификации, которые проверяют, что модель (и, возможно, контроллер?) ведут себя как ожидается.

Этот код в библиотеке Ansible успешно отправляет PUT-запрос по этому пути и обновляет поле в модели/записи:

    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)

Вот спецификация, которую я пытаюсь написать для тестирования обновлений по этому пути. Я запутался, потому что у меня в контроллере миллион вызовов puts, но ни один из них не выводит ничего, хотя puts в модели (например, в функции, вызываемой через before_save) отображаются в том, что я вижу в rake autospec.

Мое лучшее предположение — я что-то напортачил с

# 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

Я провел почти весь вчерашний день за этим и буду признателен за любые подсказки по решениям или техникам отладки.

Если s=Pfaffmanager::Server.createServerFromParams(user_id: user.id, hostname: 'bogus.invalid' , request_status: 'not updated') — это модель, которую вы создали, возможно, вам потребуется сфабриковать её для корректной работы теста запроса, аналогично тому, как пользователи были сфабрикованы ранее в вашем примере.

Ага. Так, может быть, проблема в том, что я использую фабрику вместо реального создания? В других тестах я, например, использую вышеуказанный код для создания Server, а затем делаю get, чтобы получить список серверов и убедиться, что сервер с правильным именем хоста существует и возвращается правильное количество серверов.

Хотя, вероятно, стоит разобраться, как правильно создавать объекты через фабрику.

Огромное спасибо за помощь! Попробую это в следующий раз!

Я разобрался со своей проблемой (или, по крайней мере, с одной из них). Если в вашем файле model.rb есть ошибки, например, код, который пытается выполнить что-то вроде variable_that_is_nil['xxx'], то модель падает, но в логах тестов вы не видите никаких ошибок, в отличие от лога Rails при «тестировании» через браузер. Из-за этого может показаться, что модель или контроллер не вызываются, хотя на самом деле они работают.

Впрочем, я всё-таки написал настоящий Fabricator, так что спасибо за подталкивание, @justin!