Bagaimana cara menghentikan metode untuk kelas yang dihasilkan saat run-time dengan Rails minitest?

Saya ingin menghentikan panggilan ke komponen pihak ketiga, tetapi menemukan ini cukup menantang dalam uji mini Rails. Saya akan mulai dengan pertanyaan paling mendasar di atas. Berikut ini beberapa kode semu yang sangat disederhanakan untuk menjelaskan dengan lebih baik apa yang saya coba lakukan:

class RequestController < ActionController::Base
  def schedule
    # Parse a bunch of params and validate

    # Generate a unique RequestId for this request

    # Save Request stuff in the DB

    # Call 3rd party scheduler app to queue request action
    scheduler = Scheduler.new
    submit_success = scheduler.submit_request

    # Respond to caller
   end
 end

Jadi saya sedang menulis tes integrasi untuk RequestController dan saya ingin menghentikan panggilan 'scheduler.submit_request'. Kode pengujian saya terlihat seperti ini:

def test_schedule_request
  scheduler_response = 'Expected response string for RequestId X'
  response = nil
  Scheduler.stub :submit_request, scheduler_response do
    # This test method calls the RequestController schedule route above
    response = send_schedule_request(TEST_DATA)
  end

  # Validate (assert) response
end

Tampaknya cukup mudah, tetapi tampaknya saya tidak dapat menghentikan metode untuk kelas yang belum ada (belum). Jadi bagaimana cara mematikan metode kelas untuk objek yang dibuat saat run-time dalam kode yang saya uji?


person Gusto    schedule 19.11.2013    source sumber


Jawaban (2)


Saya tidak yakin tentang minitest. Namun di rspec, Anda juga harus mematikan bagian inisialisasi dan mengembalikan objek penjadwal yang diolok-olok

Beginilah cara saya melakukannya di rspec.

mock_scheduler = double("scheduler")
Scheduler.stub(:new).and_return(mock_scheduler)
mock_scheduler.stub(:submit_request).and_return(response)

Pilihan lainnya adalah

   Scheduler.any_instance.stub(:submit_request).and_return(response)
person usha    schedule 19.11.2013

Seperti yang dicatat Vimsha, Anda harus mematikan inisialisasi kelas terlebih dahulu. Saya tidak dapat membuat kodenya berfungsi, tetapi kode pengujian yang direvisi di bawah ini memiliki gagasan yang sama:

def test_schedule_request
  scheduler_response = 'Expected response string for RequestId X'
  response = nil
  scheduler = Scheduler.new
  Scheduler.stub :new, scheduler do
    scheduler.stub :submit_request, scheduler_response do
      # This test method calls the RequestController schedule route above
      response = send_schedule_request(TEST_DATA)
    end
  end

  # Validate (assert) response
end

Terima kasih, Dave

person Gusto    schedule 20.11.2013