كتابة المواصفات لوضع على مسار/نموذج مخصص

أعمل على إضافة تكملة (plugin) تضيف نموذجًا (model). أحاول كتابة اختبارات (specs) تتأكد من أن النموذج (والمتحكم؟) يتصرفان كما هو متوقع.

هذا الكود في مكتبة 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 في المتحكم (controller) ولا تظهر أي منها، بينما تظهر عبارات 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 للحصول على قائمة الخوادم والتأكد من وجود خادم باسم المضيف الصحيح، وأن العدد الصحيح من الخوادم يتم إرجاعه.

لكن من المنطقي على الأرجح معرفة كيفية تزوير واحد بالطريقة “الصحيحة”.

شكرًا جزيلاً على مساعدتك. سأجرب ذلك في المرة القادمة!

لقد عرفت مشكلتي (أو واحدة منها، anyway). إذا كانت هناك أخطاء في ملف model.rb مثل محاولة القيام بشيء مثل variable_that_is_nil['xxx']، فإن النموذج يفشل ولكنك لا ترى أي أخطاء في سجلات الاختبار كما تفعل في سجلات Rails إذا كنت “تختبر” باستخدام متصفح. لذا قد يبدو أن النموذج أو المتحكم لم يتم استدعاؤه بينما هو في الواقع يتم استدعاؤه.

لكنني كتبت بالفعل Fabricator فعلي، لذا شكرًا لك على الدفع، @justin!