2024-01-28
RSpec で module のテストを書く方法
目次
例として Calculatable というモジュールの関数をテストしたいとします。
# calculatable.rb
module Calculatable
def add(a, b)
a + b
end
end実際にこのモジュールを include しているクラスに対してテストを書くということもできますが、クラスの関心事も入ってきてしまい書きづらいケースも多いでしょう。
以下のようなコードで module 単体のテストを書けます。
# spec/calculatable_spec.rb
RSpec.describe Calculatable do
let(:klass) do
Class.new { include Calculatable }
end
describe '#add' do
it 'returns the sum of two numbers' do
expect(klass.new.add(1, 2)).to eq 3
end
end
endClass.new で、無名のクラスを生成できます。さらにブロックを渡すと、そのクラスのコンテキストでブロックを実行してくれます。つまりこれで、Calculatable モジュールを include しただけのクラスを作ることができます。名前空間も汚さないので安心です。
別の方法
クラスは使わず、オブジェクトに対して Object#extend でモジュールを特異メソッドとして追加する方法もあります。
# spec/calculatable_spec.rb
RSpec.describe Calculatable do
let(:obj) do
Object.new.extend(Calculatable)
end
describe '#add' do
it 'returns the sum of two numbers' do
expect(obj.add(1, 2)).to eq 3
end
end
endこちらは都度の new が不要でより短くテストが書けますね。

h3pei
フリーランスのソフトウェアエンジニア。Ruby / Rails アプリケーションの開発が得意領域。設計・実装・運用まで含めてプロダクト開発が好きです。
Questalという目標達成コミュニティサービスを開発しました。仲間と一緒に目標達成に取り組みたい方はぜひご利用ください。
<< 前の記事ブログのアップデート
次の記事 >>Lofree FLOW というキーボードを使い始めた