classがネストされているmoduleのテストを通すのに色々実行しつつも失敗し、やっとこさ成功に至りましたので、備忘録兼同じように詰まっている方の参考になればと思います。
今回参考にさせていただいたのが、この記事です。
http://qiita.com/tq_jappy/items/ed56b0f4a20500252461
僕のコードの場合、クラスメソッドに対するテストコードの実装であり、Rspec & Railsともに初心者の僕にとっては困難を極めました。
対象のmoduleはだいたいこんな感じです(都合上似たような形式のコードを作成しています)。
module Test
class Module_test
def self.load
true
end
end
end
上の記事によれば、Structクラスにmoduleをincludeしてやればいいのですが、如何せん、RubyもRailsも初心者の僕にとっては書き方がわからなかったので、まず、Rubyで実装してみてから、それを参考にやっていきました。
以下がいろんなサイトを参考に自分で作成した参考コードです。
# structクラスにincludeするモジュールの作成
module Test
class Module_test
def self.load
true
end
end
end
class Struct
include Test
end
# Structクラスに関して~読み込みクラス~
Point = Struct.new("Point", :x, :y)
item_test = Point::Module_test.load
item = Point.new(100, 200)
p item
p item.x
p item.y
p item_test
# 無名クラスバージョン
Point2 = Struct.new(:z)
Point2.class
item2 = Point2.new(300)
p item2
p item2.z
classがネストされているmoduleをincludeした場合、どのように参照したら良いか、がまず僕の問題でした(そこかよって感じですけど)。
Structクラスがわからない場合はググってみてください。以外と簡単でした。
あまり使われていないようですが。
# Structクラスに関して~読み込みクラス~
Point = Struct.new("Point", :x, :y)
item_test = Point::Module_test.load
三行目の書き方が肝です。これがわかってなかったので手間取ったのですが、moduleをもっと勉強していればスムーズだったんでしょうね。
上の
class Struct
include Test
end
で最初は
class Struct
include Test::Module_test
end
と書いていたのですが、これはエラーになりました。
includeするときは、module名だけでないとダメなようです。
これをもとに、Structクラスにmoduleをincludeして書いてみた実際のテストコードが以下になります。
describe 'モジュールテスト' do
let(:module_test) { Struct.new(:test) { include Test } }
let(:test) { module_test::Module_test.load }
it 'self.loadのテスト' do
expect(test).to be(true)
end
end
クラスメソッドに対してもStructクラスにmoduleをincludeしてできたので、これを参考にしてみてください。
テストが成功してかなりスッキリしました。
おまけ
この書き方だとmoduleのテストは通らない。
module Test
class Module_test
def self.load
true
end
end
end
describe 'モジュールテスト' do
let(:test) { Test::Module_test.load }
it 'testがtrueであること' do
expect(test).to be(true)
end
end
正しくはテストは通るけど、カバーできないです。