GithubHelp home page GithubHelp logo

ngelx / nulldb Goto Github PK

View Code? Open in Web Editor NEW

This project forked from nulldb/nulldb

1.0 2.0 0.0 161 KB

An ActiveRecord null database adapter for greater speed and isolation in unit tests.

Home Page: http://nulldb.rubyforge.org

License: MIT License

Ruby 100.00%

nulldb's Introduction

The NullDB Connection Adapter Plugin

What

NullDB is the Null Object pattern as applied to ActiveRecord database adapters. It is a database backend that translates database interactions into no-ops. Using NullDB enables you to test your model business logic - including after_save hooks - without ever touching a real database.

Installation

gem install activerecord-nulldb-adapter

How

Once installed, NullDB can be used much like any other ActiveRecord database adapter:

ActiveRecord::Base.establish_connection :adapter => :nulldb

NullDB needs to know where you keep your schema file in order to reflect table metadata. By default it looks in RAILS_ROOT/db/schema.rb. You can override that by setting the schema option:

ActiveRecord::Base.establish_connection :adapter => :nulldb,
                                        :schema  => foo/myschema.rb

NullDB comes with RSpec integration. To replace the database with NullDB in all of your specs, put the following in your spec/spec_helper:

require 'nulldb_rspec'
include NullDB::RSpec::NullifiedDatabase

Or if you just want to use NullDB in a specific spec context, you can include the same module inside a context:

require 'nulldb_rspec'

describe Employee, "with access to the database" do
  fixtures :employees
  # ...
end

describe Employee, "with NullDB" do
  include NullDB::RSpec::NullifiedDatabase
  # ...
end

If you want to have NullDB enabled by default but disabled for particular contexts then (see this post)

NullDB::Rspec provides some custom matcher support for verifying expectations about interactions with the database:

describe Employee do
  include NullDB::RSpec::NullifiedDatabase

  it "should cause an insert statement to be executed" do
    Employee.create!
    Employee.connection.should have_executed(:insert)
  end
end

UnitRecord-style verification that no database calls have been made at all can be achieved by using the special :anything symbol:

describe "stuff that shouldn't touch the database" do
  after :each do
    Employee.connection.should_not have_executed(:anything)
  end
  # ...
end

You can also experiment with putting NullDB in your database.yml:

unit_test:
  adapter: nulldb

However, due to the way Rails hard-codes specific database adapters into its standard Rake tasks, you may find that this generates unexpected and difficult-to-debug behavior. Workarounds for this are under development.

Why

There are a number of advantages to writing unit tests that never touch the database. The biggest is probably speed of execution - unit tests must be fast for test-driven development to be practical. Another is separation of concerns: unit tests should be exercising only the business logic contained in your models, not ActiveRecord. For more on why testing-sans-database is a good idea, see: www.dcmanges.com/blog/rails-unit-record-test-without-the-database.

NullDB is one way to separate your unit tests from the database. It was inspired by the ARBS and UnitRecord libraries. It differs from them in a couple of ways:

  1. It works. At the time of writing both ARBS and UnitRecord were not working for me out of the box with Rails 2.0.

  2. It avoids monkey-patching as much as possible. Rather than re-wiring the secret inner workings of ActiveRecord (and thus being tightly coupled to those inner workings), NullDB implements the same [semi-]well-documented public interface that the other standard database adapters, like MySQL and SQLServer, implement.

  3. UnitRecord takes the approach of eliminating database interaction in tests by turning almost every database interaction into an exception. NullDB recognizes that ActiveRecord objects typically can’t take two steps without consulting the database, so instead it turns database interactions into no-ops.

One concrete advantage of this null-object pattern design is that it is possible with NullDB to test after_save hooks. With NullDB, you can call #save and all of the usual callbacks will be called - but nothing will be saved.

Limitations

  • It is not an in-memory database. Finds will not work. Neither will reload, currently. Test fixtures won’t work either, for obvious reasons.

  • It has only the most rudimentery schema/migration support. Complex migrations will probably break it.

  • Lots of other things probably don’t work. Patches welcome!

Version Compatibility

The specs pass against ruby 1.8.6, 1.8.7 and 1.9.1, using any version of ActiveRecord since 2.0.0, including ActiveRecord 3.0.0.

Who

NullDB was originally written by Avdi Grimm <[email protected]>. It is currently maintained by Myron Marston.

Where

Changes

* Version 0.0.1 (2007-02-18)
  - Initial Release
* Version 0.0.2 (2007-05-31)
  - Moved to Rubyforge
* Version 0.1.0 (2010-03-02)
  - Released as nulldb gem, with some bug fixes.
* Version 0.1.1 (2010-03-15)
  - Released as activerecord-nulldb-adapter gem.
* Version 0.2.0 (2010-03-20)
  - Rails 3 support.  All specs pass against ActiveRecord 3.0.0.beta.
* Version 0.2.1 (2010-09-01)
  - Updated Rails 3 support so that nulldb works against AR 3.0.0.
  - Add support for RSpec 2.

License

See the LICENSE file for licensing information.

nulldb's People

Contributors

myronmarston avatar woahdae avatar joakimk avatar technicalpickles avatar andyw8 avatar isaacsanders avatar moonmaster9000 avatar marano avatar

Stargazers

Angel avatar

Watchers

Angel avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.