Как вы временно "class_eval" для теста? - PullRequest
1 голос
/ 22 мая 2011

Можно ли временно применить определенные методы к классу для тестов?Я хочу иметь возможность запускать спецификации в зависимости от многих способов его применения.Хотя я мог бы сделать несколько приборов с разными настройками, мне проще просто 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 ]

2 голосов
/ 22 мая 2011

Я надеюсь, что есть лучший способ сделать это, но вы можете использовать это (и это с предупреждением в строке 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 голос
/ 22 мая 2011

Вы не уточнили, как вы модифицируете класс.

Библиотека 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
...