unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
Mocking

Mocking #

Mocking dalam bahasa Ruby adalah teknik yang digunakan dalam pengujian untuk mensimulasikan perilaku objek atau metode yang kompleks, yang biasanya sulit atau tidak praktis untuk diuji secara langsung. Mocking memungkinkan Anda untuk mengisolasi bagian dari kode yang ingin Anda uji dengan mengganti objek atau metode nyata dengan objek atau metode palsu (mock) yang memiliki perilaku yang telah ditentukan.

Mocking sangat berguna ketika Anda ingin menguji unit kode secara independen dari dependensi eksternal seperti panggilan API, akses database, atau operasi I/O lainnya.

Konsep Dasar Mocking #

Mocking memungkinkan Anda:

  • Mengganti metode atau objek nyata dengan yang palsu selama pengujian.
  • Mensimulasikan respons dari metode atau objek yang biasanya akan dipanggil dalam kode.
  • Memeriksa bagaimana objek atau metode dipanggil selama pengujian.

Alat untuk Mocking di Ruby #

Ada beberapa gem di Ruby yang menyediakan fungsionalitas untuk mocking, seperti:

  • RSpec Mocks: Bagian dari RSpec yang digunakan untuk mocking dan stubbing.
  • Mocha: Gem yang menyediakan mocking dan stubbing untuk pengujian unit di Ruby.
  • FlexMock: Gem lain yang dapat digunakan untuk mocking.

Mocking dengan RSpec #

RSpec adalah salah satu framework pengujian paling populer di Ruby, dan RSpec Mocks menyediakan dukungan lengkap untuk mocking dan stubbing.

Menggunakan double untuk Membuat Mock Object #

double adalah cara paling umum untuk membuat objek palsu di RSpec.

Contoh:

require 'rspec'

class User
  def initialize(name, email)
    @name = name
    @service = EmailService.new(email)
  end

  def send_welcome_email
    @service.send_email("Welcome to our service!")
  end
end

class EmailService
  def initialize(email)
    @recipient = email
  end

  def send_email(message)
    # Logika mengirim email
    puts "Sending email to #{@recipient}: #{message}"
  end
end

RSpec.describe User do
  it 'sends a welcome email' do
    email_service = double("EmailService")
    allow(email_service).to receive(:send_email).with("Welcome to our service!")

    user = User.new("Alice", "[email protected]")
    user.instance_variable_set(:@service, email_service)

    user.send_welcome_email

    expect(email_service).to have_received(:send_email).with("Welcome to our service!")
  end
end

Penjelasan:

  • double("EmailService") membuat mock object yang bertindak seperti EmailService.
  • allow(email_service).to receive(:send_email).with("Welcome to our service!") menetapkan perilaku metode yang diharapkan.
  • expect(email_service).to have_received(:send_email).with("Welcome to our service!") memeriksa apakah metode send_email dipanggil dengan argumen yang benar.

Stubbing Metode dengan allow #

Stubbing adalah proses mengganti metode nyata dengan versi yang dipalsukan yang mengembalikan hasil yang telah ditentukan.

Contoh:

class Calculator
  def add(a, b)
    a + b
  end

  def multiply(a, b)
    a * b
  end
end

RSpec.describe Calculator do
  it 'returns the sum of two numbers' do
    calculator = Calculator.new
    allow(calculator).to receive(:add).with(2, 3).and_return(5)

    expect(calculator.add(2, 3)).to eq(5)
  end
end

Penjelasan:

  • allow(calculator).to receive(:add).with(2, 3).and_return(5) membuat stub untuk metode add yang mengembalikan 5 saat dipanggil dengan argumen 2 dan 3.

Verifikasi Panggilan Metode dengan expect #

Selain stubbing, Anda juga bisa memverifikasi bahwa metode tertentu dipanggil selama pengujian.

Contoh:

RSpec.describe Calculator do
  it 'verifies that multiply is called with correct arguments' do
    calculator = Calculator.new
    allow(calculator).to receive(:multiply).with(2, 3).and_return(6)

    calculator.multiply(2, 3)

    expect(calculator).to have_received(:multiply).with(2, 3)
  end
end

Penjelasan:

  • expect(calculator).to have_received(:multiply).with(2, 3) memverifikasi bahwa metode multiply dipanggil dengan argumen 2 dan 3.

Mocking dengan Mocha #

Mocha adalah gem lain yang menyediakan fungsionalitas mocking dan stubbing, sering digunakan dengan framework pengujian unit lain seperti Test::Unit.

Menggunakan mock dengan Mocha #

Contoh:

require 'mocha/test_unit'

class Calculator
  def add(a, b)
    a + b
  end
end

class CalculatorTest < Test::Unit::TestCase
  def test_add
    calculator = Calculator.new
    calculator.expects(:add).with(2, 3).returns(5)

    assert_equal 5, calculator.add(2, 3)
  end
end

Penjelasan:

  • calculator.expects(:add).with(2, 3).returns(5) membuat mock untuk metode add yang mengharapkan argumen 2 dan 3 dan mengembalikan 5.

Verifikasi Panggilan dengan Mocha #

Mocha secara otomatis memverifikasi bahwa metode yang diharapkan telah dipanggil dengan argumen yang benar setelah eksekusi pengujian.

Contoh:

require 'mocha/test_unit'

class EmailService
  def send_email(message)
    # Logic to send email
  end
end

class EmailServiceTest < Test::Unit::TestCase
  def test_send_email
    email_service = EmailService.new
    email_service.expects(:send_email).with("Hello")

    email_service.send_email("Hello")
  end
end

Penjelasan:

  • email_service.expects(:send_email).with("Hello") membuat mock yang mengharapkan metode send_email dipanggil dengan argumen "Hello".

Mocking vs. Stubbing #

  • Mocking: Meniru objek atau metode nyata dan memverifikasi bahwa mereka dipanggil dengan cara tertentu selama pengujian.
  • Stubbing: Menggantikan metode nyata dengan versi yang dipalsukan yang mengembalikan hasil yang telah ditentukan, tanpa memverifikasi bagaimana metode tersebut dipanggil.

Mengapa dan Kapan Menggunakan Mocking #

Mocking sangat berguna ketika:

  • Mengisolasi unit kode: Anda ingin menguji satu bagian kode secara independen dari dependensi eksternal atau kompleksitas lainnya.
  • Mengurangi ketergantungan pada lingkungan: Anda menguji kode yang bergantung pada layanan eksternal (misalnya, API, database), tetapi Anda tidak ingin memanggil layanan tersebut selama pengujian.
  • Mempercepat pengujian: Dengan menggunakan mock, Anda menghindari operasi I/O yang lambat, sehingga pengujian menjadi lebih cepat.
  • Mengontrol respons: Anda ingin menguji bagaimana kode Anda bereaksi terhadap respons tertentu dari metode atau objek.

Kesimpulan #

Mocking dalam Ruby adalah teknik yang sangat penting dalam pengujian, terutama ketika Anda perlu mengisolasi bagian dari kode yang sedang diuji dari dependensi eksternal. Dengan alat seperti RSpec Mocks dan Mocha, Anda dapat dengan mudah membuat mock objects, stubbing metode, dan memverifikasi perilaku kode Anda dalam berbagai skenario. Memahami kapan dan bagaimana menggunakan mocking akan sangat meningkatkan kualitas dan keandalan pengujian unit Anda. Jika Anda memiliki pertanyaan lebih lanjut tentang mocking atau pengujian dalam Ruby, jangan ragu untuk bertanya!

« Unit Test
JSON »