DEV Community

n350071πŸ‡―πŸ‡΅
n350071πŸ‡―πŸ‡΅

Posted on

Concern | split, and spin-off, share the responsibility in Rails

πŸ¦„ Code Template

Make mogera logic into the concern.

# lib/fuga/piyo.rb ( you can make it inside of the lib πŸ‘)

module Fuga::Piyo
  extend ActiveSupport::Concern

  def mogera
    # do something...
  end
end

Then, include the mogera method.

# hoge.rb

class Hoge < ActiveRecord::Base
  include Fuga::Piyo
end

βœ… Testing

Write the test code for the mogera and the piyo module as shared_examples_for.

By building the model from metaprogramming, you can call the model which includes this concern from this concern test. ( The power of the metaprogramming 😎 )

# spec/lib/fuga/piyo_spec.rb
require 'rails_helper'

shared_examples_for 'piyo' do
  let(:model_name) { described_class.to_s.underscore.gsub(/\//,'_').to_sym }
  let(:model) { build(model_name)}

  describe 'mogera' do
    # test code
  end
end

Enable to load the test files.

# spec/rails_helper.rb
Dir[Rails.root.join('spec/lib/**/*.rb')].each { |f| require f }

Include it via rails_helper and test it at it behaves_like.

# spec/hoge_spec.rb
require 'rails_helper'

describe V3::ContactRequest do

  # I recommend to split this test from others to test it isolated. ( `rspec spec/hoge_spec.rb -e 'includes'`
  describe 'includes' do
    it_behaves_like 'piyo'
  end
end

Then, test it.

bundle exec rspec spec/hoge_spec.rb -e 'includes'

In this way, you can test this concern at each model which includes the concern.


πŸ”— Parent Note

Top comments (0)