Used to simulate PostgreSQL database delays and errors. Works with the 'pg' gem.

Wraps PG::Connection for one, more, or all class methods.

Do not use this gem in production or with data, etc. that you cannot restore. Use at your own risk.



gem install 'pg_faker'

Or, if using Bundler, put this in your Gemfile:

gem 'pg_faker'

Then run:

bundle install


The following is an example of its use in Rails console with an existing model we'll call MyModel, but this gem is not dependent on Rails or ActiveRecord:

rails c


PG::Connection.fake_delays = true
MyModel.last # => waits 5 seconds for each PG::Connection method call
PG::Connection.fake_delays = false
PG::Connection.fake_errors = true
MyModel.last # => raises error
PG::Connection.fake_delays = true
PG::Connection.fake_errors = true
PG::Connection.fake_delay_seconds = 2
MyModel.last # => delays 2 seconds and raises error
MyModel.last => pg behaves normally
PG::Connection.alter_method :async_exec # => only affect this method
PG::Connection.start_intermittent_delay_and_error # => sets fake_strategy which is called to randomize settings
MyModel.last # => may fake delay or raise error
PG::Connection.stop_intermittent_delay_and_error # => now it will behave consistently (sets fake_strategy to nil)
# this is equivalent
PG::Connection.fake_strategy = ->(m, *args) do
  PG::Connection.fake_delays = [true, false].sample
  PG::Connection.fake_errors = [true, false].sample
  puts "#{m}(#{args.inspect}) fake_delays=#{PG::Connection.fake_delays} fake_errors=#{PG::Connection.fake_errors}"
MyModel.last # => may still fake delay or raise error
PG::Connection.fake_strategy = nil # => now it will behave consistently, without the puts
PG::Connection.unalter_methods => pg behaves normally 


Copyright (c) 2013 Gary S. Weaver, released under the MIT license.