2014-06-18 30 views
10

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?

+0

Cevabım yardım etti mi? Belki bir şeyi açıklayabilirim. – zishe

+0

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

cevap

9

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ğin

bu:

# 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

+2

'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

2

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 

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 
7

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 
1

:

mesaj: hoş bir şey ile

oluşturmak, book_id: @ book.id

Ama güçlü parametrede böyle yapmak zorunda:

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.

İlgili konular