Evolving your test suite
Having a good test suite in the first place will help tremendously as you move from a monolith to microservices. Each time you remove functionality from your monolith code base, your tests will need to be updated. It's tempting to replace unit and functional tests in your Rails app with tests that make external network calls to your services, but this approach has a number of downsides. Tests that make external calls will be prone to failures caused by intermittent network connectivity issues and will take an enormous amount of time to run after a while.
Instead of making external network calls, you should modify your monolith tests to stub microservices. Tests that use stubs to represent calls to microservices will be less brittle and will run faster. As long as your microservices satisfy the API contracts you develop, the tests will be reliable indicators of your monolith code base's health. Making backwards-incompatible changes to your microservices is another topic that will be covered in a later recipe.
Getting ready
We'll use the webmock
gem for stubbing out external HTTP requests in our tests, so update your monolith gemfile to include the webmock
gem in the test group:
group :test do # ... gem 'webmock' end
You should also update spec/spec_helper.rb
to disable external network requests. That will keep you honest when writing the rest of your test code:
require 'webmock/rspec' WebMock.disable_net_connect!(allow_localhost: false)
How to do it...
Now that you have webmock
included in your project, you can start stubbing HTTP requests in your specs. Once again, open specs/spec_helper.rb
and add the following content:
stub_request(:post, "attachment-service.yourorg.example.com"). with(body:{media_type: 1}, headers: {"Content-Type" => /image\/.+/}). to_return(body: { foo: bar })