How to use Pry within Factory Girl Rails?
Asked Answered
B

1

14

In order to debug a factory I've inserted rescue binding.pry at the end of a problematic line:

after_create do |my_object, proxy|
  my_object.foreign_key_id = proxy.generated_attribute rescue binding.pry

Unfortunately, inside the resulting FactoryGirl::Declaration::Implicit context I can't seem to access the context like I would in "normal" code (NameError: undefined local variable or method `proxy' for #<FactoryGirl::Declaration::Implicit:0x0...>). How do I inspect and manipulate my_object and proxy within the Pry session?

The code is called as part of the background of a Cucumber feature:

Given the following my_objects exist:
| property |
| value    |

factory_girl_rails and factory_girl/step_definitions.rb are required by the support script.

Bloodroot answered 16/4, 2012 at 12:44 Comment(6)
I think that callback block takes only one argument. Anyway you could move binding.pry form the rescue block, put it above the second line and see what happen.Low
Could you tell us what exactly you're going to achieve?Low
@luacassus: The repo has an example with two arguments.Bloodroot
@luacassus: Putting binding.pry above the failing line makes no discernable difference - my_object still isn't available.Bloodroot
Are you sure you're using Factory.create instead Factory.build or other method?Low
It should be create - We're using the Cucumber helpers.Bloodroot
S
29

In order to allow attribute names to define attributes without having a block argument, factory_girl evaluates the definition block using instance_eval and undefines most private methods on Object, including binding. That means that when you call binding.pry above, you're not calling pry on the binding for that block; instead, you're defining a new attribute with a name of "binding" and invoking pry on the created attribute definition.

You can get around this by using Kernel.binding.pry instead.

Sining answered 3/5, 2012 at 17:45 Comment(2)
Thanks for this. This had been haunting me for a while now :)Riotous
Just in case ppl are wondering, it works with byebug as well. Kernel.binding.byebugYesima

© 2022 - 2024 — McMap. All rights reserved.