1645


例えば、以下のようなコードがあったとします。

[code]

    module Foo
      def bar(i)
        i + 1
      end
    end
    
    class Bar
      attr_accessor :some_value
      include Foo
      def initialize(any_value)
        @some_value = bar(any_value)
      end
    end
    
[/code]

このとき、`Foo`は広範囲で使われるため、`Bar`としてのテストではなく、`Foo`自体のメソッドとしてテストしたいとします。このとき、考えうる方法は二つあるかと思われます。

まず一つには`Object.new.extend(Foo)`で、`Object`のインスタンスに対して、後付けする方法。

もう一つはインスタンスメソッドにすることを諦めて、`self.bar`として定義しなおす方法。

しかし、上記二つは、どちらも余り綺麗とは言えないような気がします。上記以外で、`Module`で定義され、インスタンスメソッドとして利用されることを期待されるメソッドをテストするための、もっとスマートな方法があれば教えて下さい。


CC BY-SA 3.0
2014-12-12T15:02:16.333
1566
2016-11-06T16:10:01.210
2016-11-06T16:10:01.210
754
939
question
ruby
Rubyでインスタンスメソッドとして利用するためのModuleのメソッドを簡単にテストする方法


インスタンスメソッドである事が必要条件なのでしょうか？

その場合、`Object.new.extend(Foo)`では特異メソッドになってしまいますし、クラスメソッドにしても目的は果たせないと思います。

[code]

    Object.class_eval { include Foo }.new.bar 1
    
[/code]

上記の様に`include`を行えばインスタンスメソッドとしてテストできませんか。

単純にメソッドの入力と出力をテストしたいのであれば、一番実行しやすい構文でいいと思います。

[特異クラス・特異メソッド・メソッドの種類
Ruby](http://qiita.com/ToruFukui/items/95117f418dec590ebbc8)


CC BY-SA 3.0
2014-12-12T17:17:12.853
1567
2014-12-12T17:17:12.853
745
1566
answer


`Foo`モジュールを`include`したクラスを作成し、そのクラスのインスタンスに対してテストするとよいのではないでしょうか。

例えば[Class.new](http://docs.ruby-
lang.org/ja/2.1.0/class/Class.html#S_NEW)を使うと以下のように書けます:

[code]

    Class.new { include Foo }.new.bar(1)
    
[/code]


CC BY-SA 3.0
2014-12-16T03:02:24.663
1645
2014-12-16T03:02:24.663
2599
1566
answer


rspec などでモックオブジェクトを利用するという手もあると思います。


CC BY-SA 3.0
2015-04-21T23:56:14.633
9419
2015-04-21T23:56:14.633
9403
1566
answer