1

テストのために特定のメソッドをクラスに一時的に適用することはできますか? 適用する多くの方法に応じて仕様を実行できるようにしたいと考えています。さまざまな設定で多数のフィクスチャを作成することもできますclass_evalが、テストでモデルだけを作成する方が簡単であることがわかりました。例えば:

describe "some context"
  before do
    Page.class_eval do
      my_applying_method :some => :option
    end
  end

  it "should..."
end

次に、別のコンテキスト ブロックで:

describe "another context without the gem applied"
  before do
    Page.class_eval do
      # nothing here since I want to page to be as is
    end
  end

  it "should do something else..."
end

しかし、最後のコンテキスト ブロックの問題は、クラスが変更されていることです (上記のコンテキスト ブロックで変更されています)。後にクラスをリセットすることは可能class_evalですか? どのように?

ありがとう!

4

2 に答える 2

2

それを行うためのより良い方法があることを願っていますが、これを使用できます(Foo = Foo_old行に警告があります):

module Bar
  def baz
  end
end

class Foo
end

puts Foo.method_defined? :baz #=> false
Foo_old = Foo.dup # create a copy of our class

Foo.class_eval do
  include Bar
end

puts Foo.method_defined? :baz #=> true
Foo = Foo_old
puts Foo.method_defined? :baz #=> false
于 2011-05-22T05:52:25.420 に答える
1

クラスをどのように変更しているかを明確にしていません。

リミックスライブラリを使用すると、モジュールを一時的にインクルードし、後で適切にアンインクルードできます。

一般に、クラスを複製して複製をテストするのがおそらく最も安全です。

irb(main):001:0> class Foo; end
#=> nil
irb(main):002:0> Foo.dup.class_eval{ @x = 42 }
#=> 42
irb(main):003:0> Foo.class_eval{ @x }
#=> nil
于 2011-05-22T15:16:57.710 に答える