Rspec ile Rails denetleyicisinde güçlü params filtrelemeyi sınamak için gerçek strateji nedir? (Shoulda maççıları hariç) Başarısızlık testi nasıl yazılır ve yeşil hale getirilir?Güçlü paramları Rspec ile nasıl test edebilirim?
cevap
Beklenen ve tümü (doğru olmayan) parametrelerle 2 karma oluşturun. Daha sonra tüm paramları eyleme geçirin ve sadece beklenen paramları alan modele dikkat edin. Güçlü parametre filtreleri kullanmıyorsanız olmaz. Daha sonra paramize izinler ekleyin ve testi tekrar kontrol edin.
Örneğinbu:
# action
def create
User.create(params)
end
# spec
it 'creates a user' do
expect_any_instance_of(User).to receive(:create).
with({name: 'Sideshow Bob'}.with_indifferent_access)
post :create, user:
{ first_name: 'Sideshow', last_name: 'Bob', name: 'Sideshow Bob' }
end
başarısız olur Kullanıcı ve teste tüm params geçecek. Ve bunları filtrelediğinizde:
def user_params
params.require(:user).permit(:name)
end
ve User.create(user_params)
ile değişim eylem test geçecek. İşte
'create'' ActiveRecord :: Base' üzerinde tanımlanan ve 'User' tarafından devralınan sınıf düzeyi bir yöntemdir. Yani "wait_any_instance (User)" (Kullanıcı 'nın bir örneğinde mock beklenti) _might_ work,' ((Kullanıcı) 'parola beklentisi de (Kullanıcı)' beklemede) daha da az çalışacaktır. – dleve123
nasıl yaptığımı geçerli:
describe 'Safe Params' do
let(:mixed_params) {
{
blueprint_application_environment: {
id: 1000,
blueprint_id: 1,
application_id: 2,
environment_id: 3
},
format: :json
}
}
context "when processing a Post request with a mix of permitted and unpermitted parameters" do
before { post :create, mixed_params }
it "a create will not set the value of the unpermitted parameter" do
expect(JSON.parse(response.body)["id"]).not_to eq(1000)
end
it "a create will set the value of the permitted parameters" do
expect(JSON.parse(response.body)["blueprint_id"]).to eq(1)
expect(JSON.parse(response.body)["application_id"]).to eq(2)
expect(JSON.parse(response.body)["environment_id"]).to eq(3)
end
end
uç
Kontrolör kodu:
def create
@blueprint_application_environment = BlueprintApplicationEnvironment.new(blueprint_application_environment_params)
if @blueprint_application_environment.save
render 'show.json.jbuilder'
else
render json: @blueprint_application_environment.errors, status: :unprocessable_entity
end
end
def blueprint_application_environment_params
params.require(:blueprint_application_environment).permit(:blueprint_id, :application_id, :environment_id)
end
Ben şahsen thoughtbot gelen shoulda-matcher kullanın. Oluşturduğunuz veya güçlü parametreleri kullanarak güncelleme nesne, o da böyle yapın, normal olduğunu tek bir şey dışında benzerdir gibi
it do
should permit(:first_name, :last_name, :email, :password).
for(:update, params: params)
end
:
Ama güçlü parametrede böyle yapmak zorunda:mesaj: hoş bir şey ile
oluşturmak, book_id: @ book.id
mesaj: {book_id: book.id @, comment: {user_id: 101, book_id: book.id @ açıklamasına: "satın almaya değer"}} oluşturmak sahip
iç içe geçmiş parametrelerden geçmek için.
- 1. Rspec: Yinelemeyi nasıl test edebilirim?
- 2. Sınama işlemini nasıl test edebilirim: RSpec
- 3. STDERR'i Test :: More ile nasıl test edebilirim?
- 4. RSpec ile gemide test denetleyicileri
- 5. ActionMailer rspec ile test ediliyor
- 6. rspec kullanarak sinatra'da bir yönlendirmeyi nasıl test edebilirim?
- 7. Paralel Test Yürütme, rspec
- 8. RSpec'i kullanarak ActionCable kanallarını nasıl test edebilirim?
- 9. Bir çağrıyı rspec ile komut satırına nasıl taklit edebilirim?
- 10. İsteğe bağlı güçlü parametreler nasıl oluşturulur, ancak yine de iç içe filtre paramları kilitlenir mi?
- 11. DelayedJob'u Salatalık ile nasıl test edebilirim?
- 12. ModelState'i nasıl test edebilirim?
- 13. Rspec ile bir kaynakların üye rotalarını test etme rspec
- 14. Bir Rails 3 uygulamasının test paketini nasıl test edebilirim?
- 15. Paketim için setup.py'yi nasıl test edebilirim?
- 16. Rspec test düzeni
- 17. test raylarının rspec ile iç içe öznitelikleri
- 18. Test Dizini, Rspec
- 19. RSpec test şablonları
- 20. Mongoid'in üreteceği sorgu türünü nasıl test edebilirim?
- 21. RSpec, test veritabanında
- 22. Django URL'lerini nasıl test edebilirim?
- 23. RSpec ve Capybara (Rails) ile Test Yönlendirme
- 24. test rayları motor jeneratörü ile rspec
- 25. SSIS paketlerimi nasıl test edebilirim?
- 26. MVC Görünümlerini nasıl test edebilirim?
- 27. CanCan'ı konsolda nasıl test edebilirim?
- 28. Fonksiyon çağrılmadığında nasıl test edebilirim?
- 29. Geçersiz yöntemleri nasıl test edebilirim?
- 30. FluentMigrator geçişlerimi nasıl test edebilirim?
Cevabım yardım etti mi? Belki bir şeyi açıklayabilirim. – zishe
Teşekkürler, gerçekten bana yardımcı oldunuz. With_indifferent_access hakkında bilmiyordum. Params.require: user gibi nitelik gereksinimleri nasıl test edilir? – Molfar