私は、このような状況を抱えています。私は、クラス自体の「ダメージを受けない」テストダミーを返すインスタンスメソッドを定義しています。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でクラスを取得していますか?
逆の質問:私が何か大笑いすることを笑っているなら、教えてください。私はこのコードを単純化し、どのように動作するのかは本当にわかりません(より複雑なオリジナルは私にとって意図した通りに機能します)が、少なくともあなたはそのアイデアを得ることができれば幸いです。また、そこのウィザードは、私に良い嘲笑フレームワークをお勧めします。
感謝を。私は誰もそのような長い質問に答えないと思った。私は、インスタンスの配列をdupするときに何が起こるかはかなり確信していますが、クラスをdupするときに何が起こるかはわかりません。私の例では、最初にサブクラス化する(これは、「スーパー」を使用してメソッドをリークさせることができます)、次に私はダップアップします。最初にdupしてからサブクラス化する方がよいと思いますか? –
いずれかの人が本当にうまくいくようです。あなたは、他の人と比べて異なる結果を見たことがありますか? – x1a4