Mocha dimaksudkan untuk digunakan dalam unit test untuk tipe Mock Object atau Test Stub dari Test Double, bukan tipe Fake Object atau Test Spy. Meskipun Mocha dapat diperluas untuk memungkinkan penerapan pemalsuan dan mata-mata, kami memilih untuk tetap fokus pada tiruan dan stub.
Instal permata versi terbaru dengan perintah berikut...
$ gem install mocha
Catatan: Jika Anda ingin menggunakan Mocha dengan Test::Unit atau Minitest, Anda sebaiknya hanya menyiapkan Mocha setelah memuat pustaka pengujian yang relevan...
require 'rubygems'
gem 'mocha'
require 'test/unit'
require 'mocha/test_unit'
require 'rubygems'
gem 'mocha'
require 'minitest/autorun'
require 'mocha/minitest'
Jika Anda menggunakan Bundler, sertakan Mocha di Gemfile
dan kemudian atur Mocha nanti setelah Anda mengetahui perpustakaan tes telah dimuat...
# Gemfile
gem 'mocha'
# Elsewhere after Bundler has loaded gems e.g. after `require 'bundler/setup'`
require 'test/unit'
require 'mocha/test_unit'
# Gemfile
gem 'mocha'
# Elsewhere after Bundler has loaded gems e.g. after `require 'bundler/setup'`
require 'minitest/autorun'
require 'mocha/minitest'
RSpec menyertakan adaptor mocha. Katakan saja pada RSpec Anda ingin mengejek :mocha
:
# Gemfile in Rails app
gem 'mocha'
# Within `spec/spec_helper.rb`
RSpec . configure do | config |
config . mock_with :mocha
end
Catatan: Tidak perlu menggunakan pernyataan require untuk mengatur Mocha; RSpec melakukan ini sendiri.
# In e.g. features/support/mocha.rb
require 'mocha/api'
World ( Mocha :: API )
Around do | scenario , block |
begin
mocha_setup
block . call
mocha_verify
ensure
mocha_teardown
end
end
Jika Anda memuat Mocha menggunakan Bundler dalam aplikasi Rails, Anda harus mengatur Mocha secara manual misalnya di bagian bawah test_helper.rb
Anda.
Perhatikan bahwa sejak Rails v4 (setidaknya), ActiveSupport::TestCase
telah mewarisi dari Minitest::Test
atau yang setara sebelumnya. Jadi, kecuali Anda secara eksplisit menggunakan Test::Unit, kemungkinan besar Anda akan menggunakan Minitest.
# Gemfile in Rails app
gem 'mocha'
# At bottom of test_helper.rb (or at least after `require 'rails/test_help'`)
require 'mocha/minitest'
Ikuti instruksi untuk kerangka pengujian yang relevan di bagian Bundler, namun pastikan bahwa file Mocha yang relevan ( mocha/minitest
, mocha/test_unit
, atau mocha/api
) diperlukan setelah kerangka pengujian dimuat, misalnya di bagian bawah test_helper.rb
atau spec_helper.rb
, atau setidaknya setelah rails/test_help
diperlukan.
extend
kelas tidak berfungsi di Ruby v1.8. Lihat test/acceptance/stub_method_defined_on_module_and_aliased_test.rb
untuk contoh perilaku ini. require 'test/unit'
require 'mocha/test_unit'
class MiscExampleTest < Test :: Unit :: TestCase
def test_mocking_a_class_method
product = Product . new
Product . expects ( :find ) . with ( 1 ) . returns ( product )
assert_equal product , Product . find ( 1 )
end
def test_mocking_an_instance_method_on_a_real_object
product = Product . new
product . expects ( :save ) . returns ( true )
assert product . save
end
def test_stubbing_instance_methods_on_real_objects
prices = [ stub ( pence : 1000 ) , stub ( pence : 2000 ) ]
product = Product . new
product . stubs ( :prices ) . returns ( prices )
assert_equal [ 1000 , 2000 ] , product . prices . collect { | p | p . pence }
end
def test_stubbing_an_instance_method_on_all_instances_of_a_class
Product . any_instance . stubs ( :name ) . returns ( 'stubbed_name' )
product = Product . new
assert_equal 'stubbed_name' , product . name
end
def test_traditional_mocking
object = mock ( 'object' )
object . expects ( :expected_method ) . with ( :p1 , :p2 ) . returns ( :result )
assert_equal :result , object . expected_method ( :p1 , :p2 )
end
def test_shortcuts
object = stub ( method1 : :result1 , method2 : :result2 )
assert_equal :result1 , object . method1
assert_equal :result2 , object . method2
end
end
class Enterprise
def initialize ( dilithium )
@dilithium = dilithium
end
def go ( warp_factor )
warp_factor . times { @dilithium . nuke ( :anti_matter ) }
end
end
require 'test/unit'
require 'mocha/test_unit'
class EnterpriseTest < Test :: Unit :: TestCase
def test_should_boldly_go
dilithium = mock ( )
dilithium . expects ( :nuke ) . with ( :anti_matter ) . at_least_once # auto-verified at end of test
enterprise = Enterprise . new ( dilithium )
enterprise . go ( 2 )
end
end
class Order
attr_accessor :shipped_on
def total_cost
line_items . inject ( 0 ) { | total , line_item | total + line_item . price } + shipping_cost
end
def total_weight
line_items . inject ( 0 ) { | total , line_item | total + line_item . weight }
end
def shipping_cost
total_weight * 5 + 10
end
class << self
def find_all
# Database.connection.execute('select * from orders...
end
def number_shipped_since ( date )
find_all . select { | order | order . shipped_on > date } . length
end
def unshipped_value
find_all . inject ( 0 ) { | total , order | order . shipped_on ? total : total + order . total_cost }
end
end
end
require 'test/unit'
require 'mocha/test_unit'
class OrderTest < Test :: Unit :: TestCase
# illustrates stubbing instance method
def test_should_calculate_shipping_cost_based_on_total_weight
order = Order . new
order . stubs ( :total_weight ) . returns ( 10 )
assert_equal 60 , order . shipping_cost
end
# illustrates stubbing class method
def test_should_count_number_of_orders_shipped_after_specified_date
now = Time . now ; week_in_secs = 7 * 24 * 60 * 60
order_1 = Order . new ; order_1 . shipped_on = now - 1 * week_in_secs
order_2 = Order . new ; order_2 . shipped_on = now - 3 * week_in_secs
Order . stubs ( :find_all ) . returns ( [ order_1 , order_2 ] )
assert_equal 1 , Order . number_shipped_since ( now - 2 * week_in_secs )
end
# illustrates stubbing instance method for all instances of a class
def test_should_calculate_value_of_unshipped_orders
Order . stubs ( :find_all ) . returns ( [ Order . new , Order . new , Order . new ] )
Order . any_instance . stubs ( :shipped_on ) . returns ( nil )
Order . any_instance . stubs ( :total_cost ) . returns ( 10 )
assert_equal 30 , Order . unshipped_value
end
end
Mocha saat ini tidak berupaya untuk mengamankan thread.
Jawaban singkatnya adalah tidak. Dalam kode multi-thread, pengecualian Mocha dapat dimunculkan di thread selain thread yang menjalankan pengujian dan dengan demikian pengecualian Mocha mungkin tidak dapat dicegat dengan benar oleh kode penanganan pengecualian Mocha.
Mungkin, tapi mungkin juga tidak. Pengejekan sebagian mengubah status objek di ObjectSpace
yang dibagikan ke semua thread dalam proses Ruby dan akses ke status global yang efektif ini tidak disinkronkan. Jadi, misalnya, jika dua pengujian berjalan secara bersamaan dan salah satunya menggunakan #any_instance
untuk mengubah kelas, kedua pengujian akan segera melihat perubahan tersebut.
Rintisan bertopik dan ekspektasi pada dasarnya adalah hal yang sama. Sebuah stub hanyalah ekspektasi dari nol atau lebih pemanggilan. Metode Expectation#stubs
adalah gula sintaksis untuk membuat maksud pengujian lebih eksplisit.
Ketika suatu metode dipanggil pada objek tiruan, objek tiruan menelusuri ekspektasinya dari yang terbaru hingga terlama untuk menemukan yang cocok dengan pemanggilan tersebut. Setelah pemanggilan, ekspektasi pencocokan mungkin berhenti mencocokkan pemanggilan selanjutnya.
Lihat dokumentasi untuk Mocha::Mock
untuk detail lebih lanjut.
Jika Anda mau, Mocha dapat menghasilkan peringatan atau memunculkan pengecualian ketika:
Lihat dokumentasi untuk Mocha::Configuration
untuk rincian lebih lanjut.
MOCHA_OPTIONS
adalah variabel lingkungan yang nilainya dapat diatur ke daftar yang dipisahkan koma, sehingga kita dapat menentukan beberapa opsi misalnya MOCHA_OPTIONS=debug,use_test_unit_gem
. Hanya nilai-nilai berikut yang saat ini diakui dan berpengaruh:
debug
: Mengaktifkan mode debug yang akan menampilkan penelusuran balik untuk setiap peringatan penghentian. Hal ini berguna untuk menemukan lokasi panggilan yang tidak digunakan lagi dalam rangkaian pengujian.Lihat daftar kontributor ini.
Perbarui file RELEASE.md dengan ringkasan perubahan
Bumpkan versinya di lib/mocha/version.rb
Komit & dorong ke GitHub
Periksa apakah build CircleCI berhasil - https://app.circleci.com/pipelines/github/freerange/mocha
Hasilkan dokumentasi:
$ MOCHA_GENERATE_DOCS=true bundle install
$ MOCHA_GENERATE_DOCS=true rake generate_docs
$ curl -u < email-address > -H ' OTP: ' https://rubygems.org/api/v1/api_key.yaml > ~ /.gem/credentials ; chmod 0600 ~ /.gem/credentials
$ rake release
[runs tests]
mocha 1.2.0 built to pkg/mocha-1.2.0.gem.
Tagged v1.2.0.
Pushed git commits and tags.
Pushed mocha 1.2.0 to rubygems.org.
Mocha awalnya dipanen dari proyek di Reevoo. Sintaksnya sangat didasarkan pada jMock.
© Hak Cipta James Mead 2006
Anda dapat menggunakan, menyalin, dan mendistribusikan ulang perpustakaan ini dengan ketentuan yang sama seperti Ruby itu sendiri atau di bawah lisensi MIT.