旅好きエンジニアのメモ

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

rspecでappディレクトリ以外のテスト(libとかただのscriptとか)

rspecでappディレクトリ以外をテストしたい時ってありませんか? 自分はあります。例えばバッチ処理とかのただのrubyスクリプト

普通のテスト

まず、普通のrspecのテストって下記のような構造で appとspecの位置関係は1対1のようになっています。

.
├── app
│   │
│   └── controllers
│       └── nantoka_controller.rb
│       
└── spec
    └── controllers
        └── nantoka_controller_spec.rb

そして、describeの後にクラス名を以下のように書くものだと思います。

nantoka_controller_spec.rb

require 'rails_helper'
describe NantokaController do
  it '#nantoka_methods' do
    expect(nantoka_methods).to eq "correct"
  end
end

nantoka_controller.rb

class NantokaController
  def nantoka_methods
    "correct"
  end
end
appディレクトリ以外のテスト

今回はプロジェクト配下にscriptディレクトリを作成しています。

.
├── app
│   │
│   └── controllers
│       └── application_controller.rb
│
├── script
│   └── process.rb
└── spec
    └── script
        └── process_spec.rb

実は簡単にテストができます。 require_relative使うだけです。 describeの後は文字列にしましょう。 まぁ、いったんスクリプトだと処理が呼ばれるのは仕方ないです。

process_spec.rb

require "rails_helper"
require_relative '../../script/process'

describe "stock_info_listing_update" do
  before do
    @job = Script::Process.new
  end
  it '#nantoka_process_methods' do
    expect(@job.nantoka_methods).to eq "correct"
  end
end

process.rb

module Script
  class Process
    def nantoka_methods
      "correct"
    end
  end
end

Script::Process.new.nantoka_methods

例えばですけどスクリプトじゃないbinとかlibのテストだとScript::Process.new.nantoka_methodsを呼び出さなくていいので普段通りテストできます。

bin/process.rb

module Script
  class Process
    def nantoka_methods
      "correct"
    end
  end
end