Thanks for the tip Ben. I'll check that out. The reason the line numbers do not line up (sorry I forgot alter the error message), is that I removed all the non-essential parts of the test file (other test blocks), and proprietary information about the company that I am working for. For instance, the name of the class is really <MyCustomerName>ApiClient, etc.....
Sorry for the confusion. This code works in console, it also is working in the application. Unfortunately, I am doing some ass-backwards TDD - writing the tests after the code is already working. On Tue, Dec 27, 2011 at 2:32 PM, Ben Hughes <[email protected]> wrote: > The stack trace of the failure points to line 30 of lib/api_client.rb, but > there aren't 30 lines in what you pasted of that file - following the stack > trace should help you pin it down. > > Also you should try to replicate the problem directly in the console (test > environment), so if just doing this causes the problem, it's nothing > specific with your spec, but may be something specific with the test > environment (is the AppSettings class behavior properly in the test > environment?): > > > ApiClient.get_user_by_email('[email protected]') > > Finally, when you get this working, you can certainly use webmock or > flexmock directly, but it might help to make use of VCR which wraps some > common stuff you might be doing up quite nicely: > > https://github.com/myronmarston/vcr > > Ben > > > On Tue, Dec 27, 2011 at 5:21 PM, Benjamin Wanicur <[email protected]>wrote: > >> Hi Everyone >> >> I have spinning my wheels for awhile with this problem. I am hoping a >> more experienced TDD dev out there might be able to help. >> >> I am testing an api client that consumes an internal api that handles >> user registration / auth for several client applications. >> >> >> I have my api_client.rb file, which lives in lib/api_client.rb: >> class ApiClient >> include HTTParty >> >> protocol = (Rails.env.production? ? 'https' : 'http') >> base_uri >> "#{protocol}://#{AppSettings[:api][:hostname]}:#{AppSettings[:api][:port]}" >> default_params :token => AppSettings[:api][:api_key] >> @@ext = '.json' >> >> def self.get_user_by_email(email, all_atts=false) >> data = get("/users/by_email#{@@ext}", :query => {:email => email, >> :all_atts => all_atts}).parsed_response >> end >> >> end >> >> >> And here is the rspec file, which lives here: spec/lib/api_client_spec.rb >> require 'spec_helper' >> require 'webmock/rspec' >> >> describe ApiClient do >> >> it "should be able to detect if a user exists in the API" do >> # stub_request(:get, >> "#{API_URL}/users/by_email.json?all_atts=true&email= >> [email protected]&token=#{API_KEY}").to_return(:status => 200, >> :body => '') >> res = ApiClient.get_user_by_email('[email protected]') >> # res.should == {} >> end >> >> end >> >> >> As you can see in the spec file, I was planning on using webmock ( >> https://github.com/bblimke/webmock) to mock the API responses. However, >> things are breaking before that even happens. I have commented out the >> stub_request line, and I still get no warning/error message from webmock. >> Here is the output from my test: >> >> >> ... bundle exec rspec spec/lib/api_client_spec.rb --format=d >> >> ApiClient >> should be able to detect if a user exists in the API (FAILED - 1) >> >> Failures: >> >> 1) ApiClient should be able to detect if a user exists in the API >> Failure/Error: res = ApiClient.get_user_by_email(' >> [email protected]') >> NoMethodError: >> undefined method `info' for nil:NilClass >> # ./lib/api_client.rb:30:in `get_user_by_email' >> # ./spec/lib/api_client_spec.rb:25:in `block (2 levels) in <top >> (required)>' >> >> Finished in 17.37 seconds >> 1 example, 1 failure >> >> Failed examples: >> >> rspec ./spec/lib/api_client_spec.rb:23 # ApiClient should be able to >> detect if a user exists in the API >> >> >> I included the information about the webmock-ing *just in case*. It >> seems like the problem is happening before the ApiClient can even make its >> request. Any help is much appreciated! >> >> PS - google groups will not let you post an email address inside a post. >> the test email addresses have been hidden. >> >> -- >> SD Ruby mailing list >> [email protected] >> http://groups.google.com/group/sdruby > > > -- > SD Ruby mailing list > [email protected] > http://groups.google.com/group/sdruby > -- SD Ruby mailing list [email protected] http://groups.google.com/group/sdruby
