Можно ли написать Rails-тесты для методов с методами обратного вызова? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу написать тест для следующего метода:

class SomeObject
  def test_method
    do_something = true
    OtherObject.callback_method(do_something) do
      # test method logic
    end
  end
end

с callback_method:

class OtherObject
  def self.callback_method(true_or_false)
    #do some global checks
    yield
  end
end

С помощью Minitest возможно ли как-то заглушить обратный вызов?

Я надеялся сделать что-то вроде:

some_object = SomeObject.new()
some_object.stub(:callback_method, true) do
  #assert method logic
end

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете временно заглушить методы способом, почти идентичным тому, на который вы надеялись.( Документы для MiniTest::Object#stub)

Так как метод, который вы на самом деле хотите заглушки, - OtherObject.callback_method, вы бы заглушили его так:

OtherObject.stub(:callback_method,return_value) {} 

Теперь, когда OtherObject.callback_method вызывается внутри блока ({}), он возвращает return_value, а не вызывает метод.Таким образом, учитывая приведенный выше пример, следующий тест пройдет:

def test_returns_true_when_I_make_it 
  test_obj = SomeObject.new
  OtherObject.stub(:callback_method,true) do 
    assert test_obj.test_method, true
  end
end

Это потому, что ваш SomeObject#test_method возвращает значение OtherObject.callback_method, поэтому, поскольку я озвучил этот вызов, я на самом деле просто проверяю, работает ли заглушкаВы можете заменить значения true любыми равными объектами, которые вам нужны, и тест все равно пройдет, например,

def test_returns_foobar_when_I_make_it 
  test_obj = SomeObject.new
  OtherObject.stub(:callback_method,"foobar") do 
    assert test_obj.test_method, "foobar"
  end
end
...