你如何暂时“class_eval”进行测试?

时间:2011-05-22 04:53:17

标签: ruby 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 之后重置课程?怎么样?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您尚未阐明如何修改课程。

remix库允许您临时包含一个模块,并在以后正确地取消包含它。

一般来说,复制类并测试副本可能是最安全的:

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