On Dec 26, 2011, at 10:06 AM, Ants Pants wrote:

> Hello all,
> 
> I trust you are having a good one.
> 
> I'm just trying out macros and my first one is taken from the RSpec book 
> which replaces .....
> 
> @obj.should_not be_valid
> @obj.should have(1).error_on(:attr)
> 
> with the macro....
> 
> should_require_attribute Model, :attribute
> 
> My first attempt is basic but already I have problems.
> 
> The following is called as 
> 
> it_should_require_attribute Model, :attribute 
> 
> but I would rather call if as 
> 
> it_should_require_attribute @model, :attribute. 
> 
> I prefer this call as I want to use what has been setup in my before(:each) 
> block -- setting @model and all other housekeeping stuff required for the 
> tests -- and I can then remove dut_instance = dut.new from the macro.
> 
> Alas, my before(:each) block is not being called!! I thought it would be 
> called when the it in the macro is met.
> 
> module ModelMacros
>   ## dut - Domain Under Test
>   ## aut - Attribute Under Test
> 
>   def it_should_require_attribute(dut, aut)
>     it "is not valid with missing #{aut}" do
>       dut_instance = dut.new
>       dut_instance.send("#{aut}=", nil)
>       dut_instance.should_not be_valid
>       dut_instance.should have(1).error_on(aut.to_sym)
>     end
>   end
> end
> 
> Could anyone give me some tips on how to approach macros better for seamless 
> integration into my tests.
> 

I like to use self.described_class instead of passing classes or instances in. 
Here is an example:

def it_should_require_attribute(attribute)
  klass = self.described_class
  instance = klass.new
  instance.send("#{attribute}=", nil)  
  instance.should_not be_valid
  instance.should have(1).error_on(attribute.to_sym)
end

describe MyModel do
  it_should_require_attribute :some_attribute
end

I'm still using RSpec 1.x on Rails 2.3.x projects and have no idea if this is 
supported in RSpec 2.x.

Peace.

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to