2016-04-26 8 views
0

Ich bin neu mit Schienen und versuchen, die generierten RSPEC Tests für meine Controller garden mit ungültigen Parametern abzuschließen.Generierte RSPECT-Test fehlschlägt beim Testen POST mit ungültigen Parametern

Ich möchte square_feet immer zur Verfügung gestellt werden, aber der Fehler, den ich bekomme, scheint sich zu beschweren, dass es keinen Standardwert für die gardens Tabelle gibt. Das verwirrt mich; Ich möchte nicht einen Standardwert für square_feet festlegen und ich verstehe nicht, warum die Anwendung nicht ausgibt und den Benutzer umleiten, wenn es einen Nullwert sieht?

Der einzige Teil des generierten Tests, den ich bearbeitet habe, sind die let() Anweisungen. Was muss ich tun, um diese Tests bestehen zu können?

Rspec Test:

RSpec.describe GardensController, type: :controller do 

    let(:valid_attributes) { FactoryGirl.attributes_for(:garden) } 
    let(:invalid_attributes) { {:name => nil, :square_feet => nil, :zone => nil} } 
    let(:valid_session) { {} } 

    describe "POST #create" do 
    context "with invalid params" do 

     it "assigns a newly created but unsaved garden as @garden" do 
     post :create, {:garden => invalid_attributes}, valid_session 
     expect(assigns(:garden)).to be_a_new(Garden) 
     end 

     it "re-renders the 'new' template" do 
     post :create, {:garden => invalid_attributes}, valid_session 
     expect(response).to render_template("new") 
     end  

    end 
    end 

end 

Fabrik:

FactoryGirl.define do 
    factory :garden do 
    name "MyString" 
    square_feet 1 
    zone 1 
    garden_type "MyString" 
    user nil 
    end 
end 

DB Schema:

mysql> describe gardens; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | NO |  | NULL |    | 
| square_feet | int(11)  | NO |  | NULL |    | 
| zone  | int(11)  | NO |  | NULL |    | 
| garden_type | varchar(255) | YES |  | NULL |    | 
| user_id  | int(11)  | YES | MUL | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

Rspec Fehler:

1) GardensController POST #create with invalid params assigns a newly created but unsaved garden as @garden 
    Failure/Error: if @garden.save 

    ActiveRecord::StatementInvalid: 
     Mysql2::Error: Field 'square_feet' doesn't have a default value: INSERT INTO `gardens` (`created_at`, `updated_at`) VALUES ('2016-04-26 11:25:08', '2016-04-26 11:25:08') 
    # ./app/controllers/gardens_controller.rb:30:in `block in create' 
    # ./app/controllers/gardens_controller.rb:29:in `create' 
    # ./spec/controllers/gardens_controller_spec.rb:91:in `block (4 levels) in <top (required)>' 
    # ------------------ 
    # --- Caused by: --- 
    # Mysql2::Error: 
    # Field 'square_feet' doesn't have a default value 
    # ./app/controllers/gardens_controller.rb:30:in `block in create' 

    2) GardensController POST #create with invalid params re-renders the 'new' template 
    Failure/Error: if @garden.save 

    ActiveRecord::StatementInvalid: 
     Mysql2::Error: Field 'square_feet' doesn't have a default value: INSERT INTO `gardens` (`created_at`, `updated_at`) VALUES ('2016-04-26 11:25:08', '2016-04-26 11:25:08') 
    # ./app/controllers/gardens_controller.rb:30:in `block in create' 
    # ./app/controllers/gardens_controller.rb:29:in `create' 
    # ./spec/controllers/gardens_controller_spec.rb:96:in `block (4 levels) in <top (required)>' 
    # ------------------ 
    # --- Caused by: --- 
    # Mysql2::Error: 
    # Field 'square_feet' doesn't have a default value 
    # ./app/controllers/gardens_controller.rb:30:in `block in create' 

    3) GardensController PUT #update with invalid params assigns the garden as @garden 
    Failure/Error: if @garden.update(garden_params) 

    ActiveRecord::StatementInvalid: 
     Mysql2::Error: Column 'square_feet' cannot be null: UPDATE `gardens` SET `square_feet` = NULL, `zone` = NULL, `updated_at` = '2016-04-26 11:25:08' WHERE `gardens`.`id` = 101 
    # ./app/controllers/gardens_controller.rb:44:in `block in update' 
    # ./app/controllers/gardens_controller.rb:43:in `update' 
    # ./spec/controllers/gardens_controller_spec.rb:131:in `block (4 levels) in <top (required)>' 
    # ------------------ 
    # --- Caused by: --- 
    # Mysql2::Error: 
    # Column 'square_feet' cannot be null 
    # ./app/controllers/gardens_controller.rb:44:in `block in update' 

    4) GardensController PUT #update with invalid params re-renders the 'edit' template 
    Failure/Error: if @garden.update(garden_params) 

    ActiveRecord::StatementInvalid: 
     Mysql2::Error: Column 'square_feet' cannot be null: UPDATE `gardens` SET `square_feet` = NULL, `zone` = NULL, `updated_at` = '2016-04-26 11:25:08' WHERE `gardens`.`id` = 102 
    # ./app/controllers/gardens_controller.rb:44:in `block in update' 
    # ./app/controllers/gardens_controller.rb:43:in `update' 
    # ./spec/controllers/gardens_controller_spec.rb:137:in `block (4 levels) in <top (required)>' 
    # ------------------ 
    # --- Caused by: --- 
    # Mysql2::Error: 
    # Column 'square_feet' cannot be null 
    # ./app/controllers/gardens_controller.rb:44:in `block in update' 

Finished in 0.17718 seconds (files took 3 seconds to load) 
16 examples, 4 failures, 1 pending 

Failed examples: 

rspec ./spec/controllers/gardens_controller_spec.rb:90 # GardensController POST #create with invalid params assigns a newly created but unsaved garden as @garden 
rspec ./spec/controllers/gardens_controller_spec.rb:95 # GardensController POST #create with invalid params re-renders the 'new' template 
rspec ./spec/controllers/gardens_controller_spec.rb:129 # GardensController PUT #update with invalid params assigns the garden as @garden 
rspec ./spec/controllers/gardens_controller_spec.rb:135 # GardensController PUT #update with invalid params re-renders the 'edit' template 
+0

Es gibt ein paar Fehler hier, zum Beispiel, Ihr Update-Test sagt 'square_feet kann nicht null' sein, das mit Ihrem Schema übereinstimmt. – Anthony

+0

@Anthony: Ist das ein Fehler? Ich glaube auch, dass 'square_feet' nicht null sein sollte. Es ist nicht null in ': valid_attributes' und es ist null (zu Recht scheint es) in': invalid_attributes'. Missverstehe ich den Zweck von ': invalid_attributes'? Wenn es keine Dinge wie ': square_feet => null 'enthalten sollte, was sollte es enthalten? – doub1ejack

Antwort

2

Sie Ausnahme von innerhalb der Controller-Methode verarbeiten kann, so:

let(:invalid_create) { post :create, {:garden => invalid_attributes}, valid_session } 

it { expect(invalid_create).to raise_error(ActiveRecord::StatementInvalid) } 

in Fall möchten Sie zu stoppen Ausnahme in den Controller rescue_from Definition:

rescue_from ActiveRecord::StatementInvalid, :with => :render_statement_invalid 
+0

Hm, ok. Wie diese Tests generiert werden, ging ich davon aus, dass die Anwendung nach dem Empfang ungültiger Attribute irgendwie wissen würde, den Benutzer auf die Erstellungsseite umzuleiten. Aber vielleicht liegt es tatsächlich an mir, die Logik zu schreiben, um den Fehler zu erkennen und zu beheben, mit dem Ergebnis, dass der Benutzer auf die Erstellungsseite umgeleitet wird? – doub1ejack

+0

@ doub1ejack aktualisiert –

Verwandte Themen