- use the Ruby built-in: defined? It works for constants, methods, classes, etc.
There is no better among these two choices. Choosing which one depends on the user case. The second way specifies the scope to check if the constant exists, while the first way will seek for this constant through the ancestor trees. If you defines two constants with the same name but different values, you’d better use the 2nd way.
- scope of constants:Ruby searches for the constant definition in this order:
- The enclosing scope
- Any outer scopes (repeat until top level is reached)
- Included modules
class C X = 1 module M X = 2 class D X = 3 puts X # => 3 puts C::X # => 1 puts C::M::X # => 2 puts M::X # => 2 end end end
You can stub a method to return different values each time it’s called;
@family.stub(:location).and_return('first', 'second', 'other')
So the first time you call
@family.location it will return ‘first’, the second time it will return ‘second’, and all subsequent times you call it, it will return ‘other’.
stub! can accept a block. The block receives the parameters; the return value of the block is the return value of the stub:
class Interface end describe Interface do it "should have a stub that returns its argument" do interface = Interface.new interface.stub!(:get_trace) do |arg| arg end interface.get_trace(123).should eql 123 end end