2011-05-22 69 views
1

是否可以暂时将某些方法应用于某个类进行测试?我希望能够运行规格取决于许多方式来应用它。虽然我可以制作一系列不同设置的灯具,但我发现在测试中只需要模型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之后重置班级?怎么样?

谢谢!

回答

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 
+0

我啊'include'用'some_applying_method'其他模块。就像一个典型的插件。谢谢,这将有助于! – 2011-05-23 01:19:38

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