Как утверждать, что определенный метод вызывается с помощью 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
Ответы
Ответ 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