Versi rel: 4.1.10
Versi Rspec-rails: 3.0.2
Saya sedang menulis tes permintaan dan model memerlukan atribut menjadi boolean true
, bukan string true
.
Saat meneruskan parameter ini dari pengujian permintaan ( param[:attribute] = true
), model menerima: model.attribute = "true"
. ( "true"
sebagai string)
Saat meneruskan parameter dari tes pengontrol ( param[:attribute] = true
), model menerima: model.attribute = true
. ( true
sebagai boolean)
Bagaimana saya bisa meneruskan true
sebagai boolean ke model dari tes permintaan?
Inti dari hal di atas:
https://Gist.github.com/a-leung/cc44372f1ae776726e89
Apakah Anda mencoba model.attribute = (1 == 1)?
masalahnya bukan menugaskan model.attribute
, tetapi dalam perbedaan antara params rspec yang diteruskan dari pengontrol ( params[:attribute] = true
menghasilkan: model.attribute == true
) dan permintaan ( params[:attribute] = true
menghasilkan model.attribute == 'true'
).
dengan parameter yang sama, pengujian pengontrol meneruskan boolean true ke model, sedangkan pengujian permintaan meneruskan string true ke model.
beri tahu saya jika ada yang tidak jelas, saya dapat membuat proyek Rails sederhana untuk didemonstrasikan.
Ini adalah masalah dalam bagaimana tes Rails berperilaku, pada kenyataannya params akan selalu berupa string, kecuali sebelumnya didekodekan oleh middleware, misalnya dalam kasus JSON yang mungkin menjadi alasan tes pengontrol memungkinkan Anda untuk meneruskan objek nyata ...
baiklah. terimakasih atas klarifikasinya.
Apakah ada cara untuk mendapatkan tes permintaan untuk menggunakan middleware yang sama dengan tes pengontrol?
Mereka sudah akan.
Jika params boolean datang ke controller sebagai benar/salah dan bukan sebagai string, kemungkinan besar Anda meneruskannya sebagai JSON di dalam tubuh. Dalam hal ini, Anda harus melakukan ini:
post :update, params: { id: user.id, attribute: true }, as: :json
atau ini:
post :update, params: { id: user.id }, body: { attribute: true }.to_json, as: :json
untuk lulus mereka sebagai boolean dalam tes juga.
Komentar yang paling membantu
Jika params boolean datang ke controller sebagai benar/salah dan bukan sebagai string, kemungkinan besar Anda meneruskannya sebagai JSON di dalam tubuh. Dalam hal ini, Anda harus melakukan ini:
atau ini:
untuk lulus mereka sebagai boolean dalam tes juga.