Ruby: издеваться над методом класса с помощью MiniTest?

Я использую MiniTest 2.12.1 (последняя версия стандартной среды тестирования, поставляемая с Ruby >= 1.9 ), и я не могу понять, как с его помощью смоделировать метод класса, точно так же, как это возможно с подобными Mocha, например:

product = Product.new
Product.expects(:find).with(1).returns(product)
assert_equal product, Product.find(1)

Я несколько дней баловался Интернетом, и мне все еще нужно найти разумный ответ на этот вопрос. Пожалуйста помоги?


person Cristian R. Arroyo    schedule 05.05.2012    source источник
comment
Я думаю, что невозможно сделать такой издевательство с помощью minitest/mock, дублируется?   -  person fguillen    schedule 11.05.2012


Ответы (2)


Это может быть бесполезно для вас, если вы застряли на 2.12.1, но похоже, что они добавили заглушку метода в minitest/mock в HEAD здесь.

Итак, если бы вы обновились до minitest HEAD, я думаю, вы могли бы сделать это:

product = Product.new
Product.stub(:find, product) do
  assert_equal product, Product.find(1)
end
person Adam    schedule 11.05.2012
comment
Похоже, они пометили новую версию с тех пор, как я написал это, поэтому обновление HEAD не требуется. Самая последняя версия сейчас 3.5.0. Если вы используете упаковщик, вы можете обновить minitest, убедившись, что в вашем Gemfile есть такая строка: gem 'minitest', '3.5.0'. Если вы хотите работать с версией HEAD, вместо этого вы должны иметь это в своем Gemfile: gem 'minitest', :git => 'git://github.com/seattlerb/minitest.git'. Если вы не используете Bundler, я думаю, что gem update minitest должен это сделать. - person Adam; 25.09.2012
comment
Просто поясню: это не совсем эквивалентно решению мокко в вопросе: параметры вызова .find не проверяются с этим решением... - person severin; 29.07.2013

Что я делаю, так это просто заглушаю метод класса и заменяю его своей собственной лямбда-функцией, которая доказывает, что исходная функция была вызвана. Вы также можете проверить, какие аргументы использовались.

Пример:

  test "unsubscribe user" do
    user = create(:user, password: "Secret1", email: "[email protected]", confirmation_token: "token", newsletter_check: false)

    newsletter = create(:newsletter, name: "Learnlife News")
    unsubscribe_function = -> (email:) { @unsubscribed_email = email }

    Hubspot::Subscription.stub :unsubscribe_all, unsubscribe_function do
      get user_confirmation_en_path(confirmation_token: "token")
    end

    assert_equal @unsubscribed_email, "[email protected]"
  end
person Robin Bortlík    schedule 08.01.2021