Hiro
Hiro

Reputation: 359

Rspec model callback

I have this model that my senior dev wrote:

class Thing < ActiveRecord::Base
  after_commit on: :create do
    SomeMobule.some_method(self)
  end
end

I'm wondering how to test this callback.

I've known from the wise of the internet that you can do this:

(in model)
class Thing < ActiveRecord::Base
  after_commit :do_something

  def do_something
   # doing stuff
  end
end

(in spec)
it 'fires do_something after commit' do
  expect(@instance).to receive(:do_something)
  @instance.save
end

But I have no idea how to deal with this callback block.

Method name can be presented in symbol, easy, but what is another module's method name like in symbol? Or there's some other way to receive?

This might come from my lack of Ruby knowledge or for that matter general programming knowledge, and I have no idea even how to pursue the answer on the internet.

Upvotes: 1

Views: 411

Answers (1)

max
max

Reputation: 102036

You can just test that SomeModule.some_method(self) is called.

let(:thing) { Thing.new }

it 'calls SomeModule.do_something after commit' do
  expect(SomeModule).to receive(:do_something).with(thing)
  thing.save
end

Which is fine if SomeModule.do_something is an application boundary such as a client to an external API.

If its not the test is very low value from a BDD standpoint - it only tests how the pieces are glued together - not the actually behaviour. A better test would be to test that the expected behaviour is triggered when you save the model.

# a really contrived example
it 'becomes magical when it is saved' do
  expect do
    thing.save
    thing.reload
  end.to change(thing, :magical).from(false).to(true) 
end

Upvotes: 1

Related Questions