Hardstub

Previously I spoke about Hardmock, a mocking library. Most of the time I try to develop using Dependency Injection or at least keep instantiation of objects together. However, sometimes the real world kicks in and I can't or don't have time to refactor the code.

Enter Hardstub. This will replace the definition of a class with a mock. Again, I'm not promoting testing in this manner, but this may open possibilities that may have been previously discounted.

class Person
  def initialize(car)
@car = car
@wallet = Wallet.new
  end

  def go_to_movies
@car.drive_to_movies
@wallet.pay_for_ticket("10.00")
@car.drive_home
  end
end

class Wallet
  # not fully implemented yet
end

...
# in tests

def setup
  stub(Wallet)
  create_mock :car_mock, :wallet_mock
end

def teardown
  # this is needed
  revert_stubs
end

def test_go_to_movies
  Wallet.expects.new.returns(@wallet_mock)
  @car_mock.expects.drive_to_movies
  @wallet_mock.expects.pay_for_ticket("10.00")
  @car_mock.expects.drive_home

  person = Person.new(@car_mock)
  person.go_to_movies
end

Currently, Hardstub isn't smart enough to automatically revert the stubs, so make sure to call revert_stubs in teardown. Another tip, don't stub very common classes such as File or Dir.

Update 4/11/07

There's currently an issue that is keeping Hardmock from auto verifying, so until this is fixed, a work around is to put this in your teardown.

def teardown
  verify_mocks
ensure
  revert_stubs

  # Other teardown code
end