17 May 2014

    先日衝動買いしたInstant RSpec Test-Driven Development How-to [Kindle版]の最初に出てくるサンプルコード

    #location_spec.rb
    describe Location do
      describe "#initialize" do
        it "sets the latitude and longitude" do
          loc = Location.new(:latitude => 38.911268,
                             :longitude => -77.444243)
          loc.latitude.should == 38.911268
          loc.longitude.should == -77.444243
        end
      end
    end
    

    1. 上記テストを通過させるために「自分が書いたコード」が以下のものrspec failed
       #my_answer.rb  
       class  Location  
           attr_accessor :latitude  
           attr_accessor :longitude  
           def initialize(lati=nil, long=nil)  
               @latitude = lati  
               @longitude = long  
           end  
       end  
    
    1. 「リファクタリング前のコード」として本で紹介されているコードrspec passed
       #bad_answer.rb
       class  Location
           def initialize(args = {});end
           def latitude
               38.911268
           end
           def longitude
               -77.444243
           end
       end
    
    1. 「リファクタリング後のコード」として本で紹介されているコードrspec passed
       #model_answer.rb
       class Location
           attr_accessor :latitude, :longitude
           def initialize(args = {})
               self.latitude = args[:latitude]
               self.longitude = args[:longitude]
           end
       end
    

    テストを通過させるためだけに書かれたような「リファクタリング前のコード」がエラーにならないのに、上記「自分のコード」がエラーになるのは納得がいかない。
    自分のコードに何かエラーにしなければならない理由があるのか?自分にはわからないので誰か教えてください。



    blog comments powered by Disqus