2012-05-07 1 views
2

私は、このような状況を抱えています。私は、クラス自体の「ダメージを受けない」テストダミーを返すインスタンスメソッドを定義しています。Rubyクラスをデュプリケートするのに使用できますか? (私は原油嘲笑をしています)

require 'test/unit' 
require 'shoulda' 

module TestExtension 
    def provides_tested_class_dummy 
    self.class_exec do 
     def tested_class_dummy 
     txt = "class #{@tested_class.name}Dummy < #{@tested_class.name}; end" 
     sub = self.singleton_class.class_eval txt 
     duplicated = sub.dup 
     duplicated.class_exec do 
      # do evil things to the dummy, 
      # such as redefining constants and stubbing methods 
     end 
     end 
    end 
    end 
end 

Test::Unit::TestCase.extend TestExtensions 

快楽はまだ笑っていません。私はこれをやっているのは、私がやるべきこと、すなわち、クラスをテストしたり、テストされたクラスに触れずにダミーに悪いことをしたりするためです。

その後
class SomeClass 
    # define some constants 
    # define some methods 
end 

、それをテスト:

class SomeClassTest < Test::Unit::TestCase 
    @tested_class = ::SomeClass 
    provides_tested_class_dummy() 

    should "somehow comply" do 
    dummy = tested_class_dummy() 
    assert_kind_of Module, dummy 
    # other assertions about the dummy's behavior 
    end 
end 

今、あなたは笑って開始することができます。

私の主な質問は、私はサブクラス化テストクラスを複製「= sub.dup重複」行で、その行は何の意味もないのですか?私からは、それはブードーです。私は、テストされたクラスそのものに対するダミーに対する改ざんの悪影響を最小限に抑えるために行っています。 #dup-pingでクラスを取得していますか?

逆の質問:私が何か大笑いすることを笑っているなら、教えてください。私はこのコードを単純化し、どのように動作するのかは本当にわかりません(より複雑なオリジナルは私にとって意図した通りに機能します)が、少なくともあなたはそのアイデアを得ることができれば幸いです。また、そこのウィザードは、私に良い嘲笑フレームワークをお勧めします。

答えて

3

あなたはそれが進むべき道になりそうだdupping、元のクラスに踏みつけなく変更定数または他のクラス全体のデータのようなものをしたい場合は - 私と一緒にこれを熟考ため

class Lion 
    ROAR = 'roar!' 
end 

L2 = Lion.dup 

puts Lion::ROAR    # "roar!" 
puts Lion::ROAR.object_id # 2152285120 

puts L2::ROAR    # "roar!" 
puts L2::ROAR.object_id  # 2152285120 

L2::ROAR = 'rawrrr' 

puts Lion::ROAR    # "roar!" 
puts Lion::ROAR.object_id # 2152285120 

puts L2::ROAR    # "rawrrr" 
puts L2::ROAR.object_id  # 2152285000 
+0

感謝を。私は誰もそのような長い質問に答えないと思った。私は、インスタンスの配列をdupするときに何が起こるかはかなり確信していますが、クラスをdupするときに何が起こるかはわかりません。私の例では、最初にサブクラス化する(これは、「スーパー」を使用してメソッドをリークさせることができます)、次に私はダップアップします。最初にdupしてからサブクラス化する方がよいと思いますか? –

+0

いずれかの人が本当にうまくいくようです。あなたは、他の人と比べて異なる結果を見たことがありますか? – x1a4

関連する問題