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

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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.