簡體   English   中英

您如何暫時“ class_eval”進行測試?

[英]How do you temporarily “class_eval” for a test?

是否可以將某些方法臨時應用於類進行測試? 我希望能夠根據多種應用方式來運行規格。 雖然我可以用不同的設置制作一堆燈具,但我發現在測試中class_eval模型進行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之后重設課程 怎么樣?

謝謝!

我希望有一個更好的方法可以執行此操作,但是您可以使用它(並且在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

您尚未弄清如何修改類。

混音庫使您可以臨時包含一個模塊,並在以后適當地取消包含它。

通常,只復制類並測試重復的塊可能是最安全的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM