[rspec-users] mock feed

Sahyoun osahyoun at gmail.com
Sat Dec 1 11:42:50 EST 2007


Hello generous coders,

I'm having difficulty getting a couple of tests to pass.

I have an address model which takes an address and with a callback on save
and update passes the address to google's
geocoding service. The returned XML is parsed and saved to the address
object:

  protected

  def geocode_address
    key = "mykey"
    url = "http://maps.google.com/maps/geo?q=#{self.address_1.gsub(' ',
'+')},+#{self.postcode},+FRANCE&output=xml&key=#{key}"
    doc = Hpricot.XML(Iconv.iconv("UTF-8", "ISO-8859-2", open(URI.escape
(url)).read).to_s)
    section = (doc/"Placemark").first
    self.lat, self.lng = (section/"coordinates").text.split(',')
    self.town = (section/"LocalityName").text
    self.address_1 = (section/"ThoroughfareName").text
  end

In my spec for the address model I have as a helper:


def mock_feed
  directions = "q=71+av+Parmentier,+75011,+FRANCE&output=xml&key=mykey"
  xml = File.read(RAILS_ROOT + "/spec/fixtures/feeds/75001.xml")
  @address.should_receive(:open).exactly(1).times.
    with("http://maps.google.com/maps/geo?#{directions}").
    and_return(xml)
end

.......................

describe Address, "fetch and geocode" do
  include AddressSpecHelper

  before do
    @address = Address.new
    mock_feed
    @address.attributes = valid_address_attributes
    @address.save
  end

  it "should populate town and address 1" do
    @address.town.should eql("Paris")
    @address.address_1.should eql("71, Avenue Parmentier")
  end

  it "should populate lat and lng as BigDecimals" do
    @address.lat.should eql(BigDecimal("2.375258"))
    @address.lng.should eql(BigDecimal("48.864315"))
  end
end

My two errors:

2)
NoMethodError in 'Address fetch and geocode should populate town and address
1'
undefined method `read' for #<String:0x32a0370>

1)
NoMethodError in 'Address fetch and geocode should populate lat and lng as
BigDecimals'
undefined method `read' for #<String:0x32b6d50>

These tests passed fine with a previous version of the geocode_address
method:

protected

def geocode_address
  key = "mykey"
  url = "http://maps.google.com/maps/geo?q=#{self.address_1.gsub(' ',
'+')},+#{self.postcode},+FRANCE&output=xml&key=#{key}"
  doc = Hpricot.XML(open(url))
  self.lat, self.lng = (doc/"coordinates").text.split(',')
  self.town = (doc/"LocalityName").text
  self.address_1 = (doc/"ThoroughfareName").text
end

I'm new to rspec and the ideas behind mocks and stubs. I don't understand
why rspec is
paying any notice to 'read'. Do I also need to inform the mock of the 'read'
method? If so, how and why?
Any pointers would be gratefully received.

Many thanks
O
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/rspec-users/attachments/20071201/40018e75/attachment-0001.html 


More information about the rspec-users mailing list