2011-05-22 25 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