Saya memiliki pengontrol:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Bagaimana cara menguji metode privat current_account
dengan rspec?
PS Saya menggunakan Rspec2 dan Ruby on Rails 3
ruby-on-rails
rspec
petRUShka
sumber
sumber
Jawaban:
Gunakan #instance_eval
sumber
Saya menggunakan metode kirim. Misalnya:
Karena "kirim" dapat memanggil metode pribadi
sumber
.send
?Di mana metode current_account digunakan? Apa tujuannya?
Umumnya, Anda tidak menguji metode privat melainkan menguji metode yang memanggil metode privat.
sumber
Seharusnya tidak menguji metode privat Anda secara langsung, metode tersebut dapat dan harus diuji secara tidak langsung dengan menggunakan kode dari metode publik.
Ini memungkinkan Anda untuk mengubah internal kode Anda tanpa harus mengubah pengujian Anda.
sumber
Anda dapat menjadikan Anda metode pribadi atau dilindungi sebagai publik:
Letakkan saja kode ini di kelas pengujian Anda yang menggantikan nama kelas Anda. Sertakan namespace jika ada.
sumber
sumber
Metode pribadi pengujian unit tampaknya terlalu di luar konteks dengan perilaku aplikasi.
Apakah Anda menulis kode panggilan Anda terlebih dahulu? Kode ini tidak disebut dalam contoh Anda.
Perilakunya adalah: Anda ingin sebuah objek dimuat dari objek lain.
Mengapa Anda ingin menulis tes di luar konteks dari perilaku yang harus Anda coba gambarkan?
Apakah kode ini digunakan di banyak tempat? Butuh pendekatan yang lebih umum?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
sumber
Gunakan permata rspec-context-private untuk sementara membuat metode privat menjadi publik dalam suatu konteks.
Ini berfungsi dengan menambahkan konteks bersama ke proyek Anda.
Kemudian, jika Anda mengirimkan
:private
metadata kedescribe
blok, metode privat akan menjadi publik dalam konteks itu.sumber
Jika Anda perlu menguji fungsi privat buat metode publik yang memanggil privat.
sumber
Saya tahu ini agak hacky, tetapi berfungsi jika Anda ingin metode yang dapat diuji oleh rspec tetapi tidak terlihat di prod.
Sekarang ketika Anda dapat menjalankan spesifikasi Anda seperti ini:
sumber