API-based client/serverAPI-based client/server
applications with TDD andapplications with TDD and
ActiveResourceActiveReso...
Database-backedDatabase-backed
DB
Application
ActiveRecord
SQL
API-backedAPI-backed
Client
Application
ActiveResource
Server
Application
API
JSON
DB
SQL
Tradeoffs?Tradeoffs?
DB-backed
Fast
ActiveRecord well developed
Complex relationships possible
Limited scalability—tight c...
Client
Application
(Flash or JS)
Frontend ScalabilityFrontend Scalability
Client
Application
ActiveResource
Server
Applica...
Rails ActiveResourceRails ActiveResource
Model objects that behaves ActiveRecord objects
Maps CRUD operations to RESTful A...
From CRUD to RESTFrom CRUD to REST
class Person < ActiveResource::Base
site “http://server.example.com/people”
format :jso...
Resourceful RoutesResourceful Routes
map.resources :people (in config/routes.rb)
people_path, people_url “named route meth...
Hyperactive ResourceHyperactive Resource
http://github.com/taryneast/hyperactiveresource
Adds Associations
Supports nested...
Let's do some codingLet's do some coding
Demo
RESTful Person Server API with JSON
HyperactiveResource-based client
TDD anyone?TDD anyone?
DB
Application
ActiveRecord
SQL
RSpec model tests
with fixtures, factories
Test Database
with trans...
TDD ActiveRecord StyleTDD ActiveRecord Style
it “should create the object” do
lambda {
Person.create(:first_name => “Joe”)...
API-backedAPI-backed
Client
Application
ActiveResource
Server
Application
API
JSON
DB
SQL
RSpec model test
Test Database
o...
Mocks anyone?Mocks anyone?
FakeWeb gem: http://github.com/chrisk/fakeweb
FakeWeb.register_uri(:get,
"http://server.example...
Problems with Mocks?Problems with Mocks?
If the server code is under our control...
What happens if the server API changes...
Beyond MocksBeyond Mocks
Remote Specs
Rely on remote server running (in test environment)
Mechanism to set up data
Mechani...
Distributed Ruby “DRb”Distributed Ruby “DRb”
Client
Application
DRb Client
Server
Application
DRb Server
DRb
Remote
Method...
Demo DRb
Gotcha'sGotcha's
ActiveResource::Base.include_root_in_json
after_initialize hook for starting DRb server
:id problem for O...
SummarySummary
Server application with REST controller
Client application with ActiveResource
Use DRb to:
test objects
inq...
BizConfBizConf
Aug 4-6, 2010
Amelia Island, FL
Discount code: WOLF
for 43% off
http://bizconf.org?
coupon=WOLF
Rails & Web...
Upcoming SlideShare
Loading in …5
×

2010 07-20 TDD with ActiveResource

304 views

Published on

API-based client/server applications with TDD and ActiveResource
github: http://github.com/wolframarnold/tdd_with_activeresource

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2010 07-20 TDD with ActiveResource

  1. 1. API-based client/serverAPI-based client/server applications with TDD andapplications with TDD and ActiveResourceActiveResource Wolfram ArnoldWolfram Arnold www.rubyfocus.bizwww.rubyfocus.biz In collaboration with:In collaboration with: Kurt SnyderKurt Snyder papercheck.compapercheck.com marakana.commarakana.com
  2. 2. Database-backedDatabase-backed DB Application ActiveRecord SQL
  3. 3. API-backedAPI-backed Client Application ActiveResource Server Application API JSON DB SQL
  4. 4. Tradeoffs?Tradeoffs? DB-backed Fast ActiveRecord well developed Complex relationships possible Limited scalability—tight coupling API-backed Extra network & server latency Complex relationships more difficult Scales well to different front-ends—loose coupling
  5. 5. Client Application (Flash or JS) Frontend ScalabilityFrontend Scalability Client Application ActiveResource Server Application API JSON DB SQL Client Application (Mobile)
  6. 6. Rails ActiveResourceRails ActiveResource Model objects that behaves ActiveRecord objects Maps CRUD operations to RESTful API No Associations No Validations (added in Rails 3) Rougher around the edges than ActiveRecord
  7. 7. From CRUD to RESTFrom CRUD to REST class Person < ActiveResource::Base site “http://server.example.com/people” format :json end Person.create(:name => “Joe”) → POST /people, {'name':'Joe'} Person.find(4) → GET /people/4
  8. 8. Resourceful RoutesResourceful Routes map.resources :people (in config/routes.rb) people_path, people_url “named route methods” GET /people → “index” action POST /people → “create” action new_person_path, new_person_url GET /people/new → “new” action edit_person_path, edit_person_url GET /people/:id/edit → “edit” action with ID person_path, person_url GET /people/:id → “show” action with ID PUT /people/:id → “update” action with ID DELETE /people/:id → “destroy” action with ID
  9. 9. Hyperactive ResourceHyperactive Resource http://github.com/taryneast/hyperactiveresource Adds Associations Supports nested routes /people/5/addresses/3 But: Cannot mix nested and non-nested routes for the same resource Adds Validations
  10. 10. Let's do some codingLet's do some coding Demo RESTful Person Server API with JSON HyperactiveResource-based client
  11. 11. TDD anyone?TDD anyone? DB Application ActiveRecord SQL RSpec model tests with fixtures, factories Test Database with transaction support
  12. 12. TDD ActiveRecord StyleTDD ActiveRecord Style it “should create the object” do lambda { Person.create(:first_name => “Joe”) }.should change(Person, :count).by(1) end it “should destroy the object” do p = Factory.create(:person) lambda { p.destroy }.should change(Person, :count).by(-1) end
  13. 13. API-backedAPI-backed Client Application ActiveResource Server Application API JSON DB SQL RSpec model test Test Database on Test Server instance!
  14. 14. Mocks anyone?Mocks anyone? FakeWeb gem: http://github.com/chrisk/fakeweb FakeWeb.register_uri(:get, "http://server.example.com/people", :body => "Hello World!") Body is the mock object. It should simulate the server response. Great solution if it's a 3rd party server.
  15. 15. Problems with Mocks?Problems with Mocks? If the server code is under our control... What happens if the server API changes but the mock doesn't? What process keeps the simulated server responses and the actual API in sync? Better ideas?
  16. 16. Beyond MocksBeyond Mocks Remote Specs Rely on remote server running (in test environment) Mechanism to set up data Mechanism to inspect data Mechanism to clean up data
  17. 17. Distributed Ruby “DRb”Distributed Ruby “DRb” Client Application DRb Client Server Application DRb Server DRb Remote Method Invocation foo(args) foo(args)
  18. 18. Demo DRb
  19. 19. Gotcha'sGotcha's ActiveResource::Base.include_root_in_json after_initialize hook for starting DRb server :id problem for Objects, via DRb Need to run server in test mode Ideas/Questions: Front Object in DRb? rake task to start/stop server—reliably find process? DRb port inflation—better way?
  20. 20. SummarySummary Server application with REST controller Client application with ActiveResource Use DRb to: test objects inquire “actual” data TDD with ActiveResource
  21. 21. BizConfBizConf Aug 4-6, 2010 Amelia Island, FL Discount code: WOLF for 43% off http://bizconf.org? coupon=WOLF Rails & Web App Professionals, Entrepreneurs, Consultants Small group Network with Who's Who Organized by Obie Fernandez of Hashrocket Highlight: David Allen

×