Ruby: Mocking a Class Method with Minitest?

Ruby: Mocking a Class Method with Minitest?

I'm using MiniTest 2.12.1 (the latest version of the stock testing framework shipped with Ruby >= 1.9) and I can't figure out how to mock a class method with it, the same way it's possible with the likes of Mocha, for example:

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

I've been dabbling the Internet for days and I'm still to find a reasonable answer to this. Please help?

1

2 Answers

This might not be helpful to you if you're stuck using 2.12.1, but looks like they added method stubbing to minitest/mock in HEAD here.

So, were you to update to minitest HEAD, I think you could do this:

product = Product.new
Product.stub(:find, product) do
  assert_equal product, Product.find(1)
end
2

What I do is that I simply stub the class method and replace it with my own lambda function which proves that original function was called. You can also test what arguments were used.

Example:

  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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Alexander Ross
Author

Alexander Ross

Alexander Ross has covered the video game industry for a decade, writing deep dives on game design, esports tournaments, VR developments, and gaming culture.