Подтвердить что ты не робот

Как утверждать, что определенный метод вызывается с помощью Ruby minitest framework?

Я хочу проверить, правильно ли функция вызывает другие функции с minitest Ruby, но я не могу найти правильный assert для проверки из doc.

Исходный код
class SomeClass
  def invoke_function(name)
    name == "right" ? right () : wrong ()
  end

  def right
    #...
  end

  def wrong
    #...
  end
end
Код проверки:
describe SomeClass do
  it "should invoke right function" do
    # assert right() is called
  end

  it "should invoke other function" do
    # assert wrong() is called
  end
end
4b9b3361

Ответ 1

С помощью minitest вы используете метод expect, чтобы установить ожидание вызова метода на макет-объект таким образом

obj = MiniTest::Mock.new
obj.expect :right

Если вы хотите установить ожидание с параметрами и возвращаемыми значениями, то:

obj.expect :right, return_value, parameters

И для конкретного объекта вроде:

obj = SomeClass.new
assert_send([obj, :right, *parameters])

Ответ 2

Minitest имеет специальный .expect :call для проверки, вызван ли какой-либо метод.

describe SomeClass do
  it "should invoke right function" do
    mocked_method = MiniTest::Mock.new
    mocked_method.expect :call, return_value, []
    some_instance = SomeClass.new
    some_instance.stub :right, mocked_method do
      some_instance.invoke_function("right")
    end
    mocked_method.verify
  end
end

К сожалению, эта функция не документирована очень хорошо. Я нашел об этом отсюда: https://github.com/seattlerb/minitest/issues/216

Ответ 3

В соответствии с данным примером, нет другого класса делегата, и вы хотите убедиться, что метод правильно вызван из того же класса. Затем ниже фрагмент кода должен работать:

class SomeTest < Minitest::Test
  def setup
    @obj = SomeClass.new
  end

  def test_right_method_is_called
    @obj.stub :right, true do
      @obj.stub :wrong, false do
        assert(@obj.invoke_function('right'))
      end
    end
  end

  def test_wrong_method_is_called
    @obj.stub :right, false do
      @obj.stub :wrong, true do
        assert(@obj.invoke_function('other'))
      end
    end
  end
end

Идея состоит в том, чтобы заглушить [method_expect_to_be_called], возвращая простое значение true, а в блоке заглушки утверждают, что он действительно вызывается и возвращает значение true. Чтобы заглушить другой неожиданный метод, просто убедитесь, что он не вызывается.

Примечание: assert_send не будет работать правильно. Пожалуйста, обратитесь к официальному документу.

Фактически, инструкция ниже будет проходить, но не означает, что она работает как ожидалось:

assert_send([obj, :invoke_function, 'right'])
# it just calling invoke_function method, but not verifying any method is being called