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.
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