Вызов метода вызова без заглушки? - PullRequest
1 голос
/ 18 февраля 2012

Я хотел бы заявить, что был вызван определенный метод, но я не хочу смоделировать / заглушить метод - я хочу включить этот код в тест.Рубин, что-то вроде:

def bar()
  #stuff I want to test
end

def foo()
  if condition
    bar()
  end

  #more stuff I want to test
end

# The test:

foo()
assert_called :bar

У кого-нибудь есть предложение (или лучший способ это сделать)?Мой настоящий код немного сложнее, поэтому, пожалуйста, не принимайте во внимание простоту примера.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Возможно что-то вроде:

require 'set'

class Class
  def instrument
    self.instance_methods.each do |m|
      old = method(m)
      define_method(m) do |*a,&b|
        @__called__ ||= Set.new
        @__called__ << m
        old.bind(self).call(*a,&b)
      end
    end
  end
end

class Object
  def assert_called(method)
    if not (@__called__ && @__called__.include?(method))
      # You will have to figure out how to make this equivalent to a failing
      #   assertion for your favorite test framework
      raise "Assertion failed! #{method} has not been called"
    end
  end
end

Затем, после определения ваших классов, но до запуска тестов:

FooClass.instrument

Обратите внимание, что я еще не тестировал этот код!

0 голосов
/ 18 февраля 2012

Это действительно хороший способ сделать два тестовых примера: один вызовет foo() и проверит, вызван ли bar(), а другой - проверяет, хорошо ли работает bar()Когда вы тестируете foo(), вы должны знать, что bar() должно вернуть.

...