|
This is a blog of mcr at sandelman.ca |
Thu, 01 Dec 2011Active Scaffold obscures internal errorsIn a newly scaffold'ed model and controller, created with ActiveScaffold 3.0.5, on rails 3.0.9, I was getting errors from the default created rspec code that I could not diagnose:
1) Admin::ConnectionsController POST create with valid params creates a new Connection
Failure/Error: post :create, :connection => valid_attributes
NoMethodError:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
# ./spec/controllers/admin/connections_controller_spec.rb:54
Worse, these things were working just fine in RAILS_ENV=development. Well, of course, it is failing on the line where the :create is invoked. But, where is the nil.each occuring? I ran things with: bundle exec rspec -d spec/controllers/admin/connections_controller_spec.rb \ -e "POST create with valid params creates a new Connection" after putting "debugger" in before the test case:
describe "POST create" do
describe "with valid params" do
it "creates a new Connection" do
# expect {
debugger
post :create, :connection => valid_attributes
#}.to change(Connection, :count).by(1)
end
(I'm still looking for a good ruby-debug mode that works like gdb-mode in Emacs works, that can show me the code around where I am...) One winds up in the rescue in: /var/lib/gems/1.8/gems/actionpack-3.0.9/lib/action_controller/metal/rescue.rb on line 19. So, stick a breakpoint on the super there: break /var/lib/gems/1.8/gems/actionpack-3.0.9/lib/action_controller/metal/rescue.rb:17 This lets you see the exception: (rdb:1) p exception #<NoMethodError: You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.each> The annoying part is that the action is invoked at
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
so, it evaluates code, and there are in fact one block passed to another block, and it seems really hard (a major ruby-debug limitation), that I can not put a breakpoint easily into the beginning of a block passed in. I had to resort to editing that file, and sticking "debugger" in there! Finally, one gets to: /var/lib/gems/1.8/gems/actionpack-3.0.9/lib/abstract_controller/base.rb:150 send_action(method_name, *args) In the debugger, the right thing to do is: catch NoMethodError This finally shows me that the failure is at: /corp/projects/credil/hydra/t3041/vendor/plugins/active_scaffold/lib/active_scaffold/attribute_params.rb:42 Why? Because attributes is nil. Why, because the generated controllers spec file says:
describe "with valid params" do
it "creates a new Connection" do
expect {
post :create, :connection => valid_attributes
}.to change(Connection, :count).by(1)
end
should have been generated as:
describe "with valid params" do
it "creates a new Connection" do
expect {
post :create, :record => valid_attributes
}.to change(Connection, :count).by(1)
end
posted at: 11:37 | path: /ruby-on-rails | permanent link to this entry
|