EndpointStub
I found that testing solutions for ActiveResource were either sub-optimal or outdated, so I decided to make my own using WebMock.
EndpointStub is kind of like the built in ActiveResource HTTPMock, except you can bind logic and dynamic routes to it, so it's like a mini controller almost. EndpointStub comes with the default RESTful CRUD actions supported by ActiveResource built in (currently JSON format only). It also comes with an interface for defining your own routes and logic.
Nested resources are currently pending, but definitely implementable via custom response mocking.
Installation
Add this line to your application's Gemfile:
gem 'webmock'
gem 'endpoint_stub'
And then execute:
$ bundle
Or install it yourself as:
$ gem install endpoint_stub
Usage
Add
require 'endpoint_stub'
to your spec_helper / test_helper. Then, in your tests, you can call
Endpoint::Stub.create_for(MyActiveResourceModel)
which will bring MyActiveResourceModel to life! Here is a more in-depth example.
class Greeter < ActiveResource::Base
def say_hi_to(someone)
"#{self.greeting}, someone"
end
self.site = "http://example.com/api/greeter"
end
Endpoint::Stub.create_for(Greeter)
record = Greeter.create(greeting: 'hello')
record.say_hi_to('sir') # ===> "hello, sir"
record.greeting = 'hey...'
record.save # ===> true
record.greeting # ===> 'hey...'
record.destroy
record.destroyed? # ===> true
Greeter.create(greeting: 'hi')
Greeter.create(greeting: 'ahoy')
Greeter.all # ===> [{id: 1, greeting: 'hi'}, {id: 2, greeting: 'ahoy'}]
Also, custom responses and default attributes:
class Test < ActiveResource::Base
self.site = "http://example.com/api/whatever"
end
Endpoint::Stub.create_for(Test) do
add_default test_attr: 'nice'
mock_response(:put, '/:id/change') do |response, params, stub|
stub.update_record params[:id], test_attr: '*changed*'
{ body: "did it" }
end
end
record = Test.create
record.test_attr # ===> 'nice'
record.put(:change).body # ===> 'did it'
record.reload
record.test_attr # ===> '*changed*'
Afterwards, custom responses can be un-mocked:
Endpoint::Stub[Test].unmock_response(:put, '/:id/change') # ===> true
Contributing
- Fork it ( http://github.com/
/endpoint_stub/fork ) - Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request