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
Es gibt ein paar Fehler hier, zum Beispiel, Ihr Update-Test sagt 'square_feet kann nicht null' sein, das mit Ihrem Schema übereinstimmt. – Anthony
@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