10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rspecでmoduleのテストを作成する

Last updated at Posted at 2017-04-10

classがネストされているmoduleのテストを通すのに色々実行しつつも失敗し、やっとこさ成功に至りましたので、備忘録兼同じように詰まっている方の参考になればと思います。

今回参考にさせていただいたのが、この記事です。
http://qiita.com/tq_jappy/items/ed56b0f4a20500252461

僕のコードの場合、クラスメソッドに対するテストコードの実装であり、Rspec & Railsともに初心者の僕にとっては困難を極めました。
対象のmoduleはだいたいこんな感じです(都合上似たような形式のコードを作成しています)。

module_test.rb
module Test
 class Module_test
  def self.load
   true
  end
 end
end

上の記事によれば、Structクラスにmoduleをincludeしてやればいいのですが、如何せん、RubyもRailsも初心者の僕にとっては書き方がわからなかったので、まず、Rubyで実装してみてから、それを参考にやっていきました。

以下がいろんなサイトを参考に自分で作成した参考コードです。

struct_module.rb
# 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して書いてみた実際のテストコードが以下になります。

test.rb
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.rb
module Test
 class Module_test
  def self.load
   true
  end
 end
end
test_miss.rb
describe 'モジュールテスト' do
 let(:test) { Test::Module_test.load }
 
 it 'testがtrueであること' do
  expect(test).to be(true)
 end
end

正しくはテストは通るけど、カバーできないです。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?