[rspec-users] Help needed

Jarkko Laine jarkko at jlaine.net
Sat May 17 14:21:39 EDT 2008


Hi Jens,

On 17.5.2008, at 20.34, Jens Carroll wrote:

> Hi All,
>
> I am new to rspec and it seems that I don't understand some basics.
> I need to have a XML import which should parse through XML data
> and saves all that in various mysql tables. The XML part works just
> fine and I can test this with rspec. However when I try to execute
>
> it "should find country object for DE" do
>
> I get an error. @user.country is a one-to-many relation in the user  
> table. It seems easy but I don't get it (hmmmm feels like I am still  
> a newbie).
>
> The error I get is:
>
> 'XmlImport should find country object for DE' FAILED
> expected #<Country:0x..fdb71beba @name="Country_1001">, got nil  
> (using .equal?)
>
>
> Any help very appreciated.
> Thanks
> Jens
>
> --- model ---
>
> require 'hpricot'
> class XmlImport #< ActiveRecord::Base
>
>  attr_reader :doc, :user
>
>  def parse_xml(file)
>    @doc = Hpricot.XML(open(file))
>
>    (@doc/:member).each do |data|
>      retrieve_and_save_user(data)
>    end
>  end
>
>  def retrieve_and_save_user(data)
>    # email address must be unique for members
>    @user = User.find_or_initialize_by_email(email)
>
>    # save user if not existing
>    if @user.new_record?
>      @user.country =  
> Country.find_by_short((data/:countryShort).inner_html)
>    end
>  end
> end
>
>
> ---- spec -------
>
> module XmlImportSpecHelper
>
>  def mock_xml_import
>    xml_file = RAILS_ROOT + "/spec/fixtures/import-member.xml"
>    xml = File.read(xml_file)
>
>    @xml_import = XmlImport.new
>    @xml_import.should_receive(:open).exactly(1).times.
>      with("any-file-name.xml").
>      and_return(xml)
>  end
>
> end
>
> describe XmlImport do
>
>  include XmlImportSpecHelper
>
>  before(:each) do
>    mock_xml_import
>    @xml_import.parse_xml("any-file-name.xml")
>
>    @country = mock_model(Country)
>    Country.stub!(:find_by_short).and_return(@country)

In order to have the above stubbing and mocking work, it must be done  
*before* you use them in the actual code. It seems to me that  
parse_xml is where you want to use them.

>
>  end
>
>  it "should find country object for DE" do
>     
> Country.should_receive(:find_by_short).with("DE").and_return(@country)

Same here. should_receive must always be defined before you run the  
code that is expected to do something. In this case, parse_xml and  
thus Country.find_by_short is run without any stubbing so it will go  
to the database and probably find nothing.

>
>    @xml_import.user.country.should equal(@country)
>  end
> end
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

--
Jarkko Laine
http://jlaine.net
http://dotherightthing.com
http://www.railsecommerce.com
http://odesign.fi


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2417 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20080517/9e7dcf98/attachment.bin>


More information about the rspec-users mailing list