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