Friday, May 6, 2011

Way to specing simple model method

Right now I have a model function that is something like this:

Class Address
  def first_line
    "#{self.building_name} #{self.street_name} #{self.suburb}".squeeze(" ").strip
  end
end

My address factory is define like this:

Factory.define :address do |f|
  f.building_name "Alpha"
  f.street_name "Bravo St"
  f.suburb "Charlie"
end

There are basically two ways to write the spec, first one is:

before(:each) do
  @address = Factory.build(:address)
end

@address.first_line.should == @address.building_name + " " +
                              @address.street_name + " " + 
                              @address.suburb

And other way is

@address.first_line.should == "Alpha Bravo St Charlie"

Which way do you think is better? And what is the reason for supporting one against the other?

From stackoverflow
  • Neither. The first is a bit verbose and also feels a bit too pally with the implementation of the method. The second tightly couples your specs to your factories and will be a massive pain when you need to change the Factory.

    Instead, use the short second style, but make the data used explicit in the spec:

    @address = Factory.build(:address, :building_name => "Alpha",
                                       :street_name => "Bravo St.",
                                       :suburb => "Charlie")
    
    @address.first_line.should == "Alpha Bravo St. Charlie"
    

    This is also good because you can provide different test data to the method, which is necessary to test some of its other features:

    @address = Factory.build(:address, :building_name => "Alpha    ",
                                       :street_name => "   Bravo St. ",
                                       :suburb => "   Charlie   " )
    
    @address.first_line.should == "Alpha Bravo St. Charlie"
    

0 comments:

Post a Comment