activerecord-nulldb-adapter 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9b442065de1ab8b6f9a1b9a4c887b4446a50ac777c8a3800f07dc7bd7806d95
4
- data.tar.gz: 0ccc56568e9610f033361f6229e096966d242edec12e30cfe674bba268da7dc8
3
+ metadata.gz: 0da8a5f679279b76c36a80995783db057cf0bbc680d4006209619d068c55fbf3
4
+ data.tar.gz: eb7c91fe3bd86f1d8787cd2dc394aeecc1b8c0950e7133fb4a21f74f6e596a8d
5
5
  SHA512:
6
- metadata.gz: daa0faddba9520e94ee32f169054623ca1276c2a137e8ee9f329f8c1e3a1ad60f7f08cf3febb1b3a96b71bc5955d7d89c11944f15dc77a9b2ddc555a25d7200e
7
- data.tar.gz: 3c58d754ec1aeb41c0296e5d1b9d298581588dd40a67701e1eabd12e9c7b1d589bec39774afbf098fadaa19a02f04c902826f80bdaea42d47d6054e90ff6a29d
6
+ metadata.gz: 87e4cb3496818735480c034bb2444bec7cdd60eb6032332d78875d3f1cd8bb769f256d70d8a80b254cc11d9c91564b76f32fe8f863d65dba5d13427a4d6f74d1
7
+ data.tar.gz: ae332ef581de6f46f46940d2f4c6a0011606abbe2432e258a88b7ab9b5c0be50af03a9b140b630c4e79228c3ed65d4569ae50f9e828ad37d3b64dc031de9bcbf
@@ -10,18 +10,31 @@ jobs:
10
10
  activerecord_5.2,
11
11
  activerecord_6.0,
12
12
  activerecord_6.1,
13
+ activerecord_7.0,
13
14
  activerecord_master,
14
15
  ]
15
- ruby: ["2.5", "2.6", "2.7", "3.0", "jruby-9.2.13.0"]
16
+ ruby: ["2.5", "2.6", "2.7", "3.0", "jruby-9.3.1.0"]
16
17
  exclude:
17
18
  - ruby: "3.0"
18
19
  gemfile: activerecord_5.2
19
20
 
20
- - ruby: "jruby-9.2.13.0"
21
- gemfile: activerecord_6.1
21
+ - ruby: "2.5"
22
+ gemfile: "activerecord_master"
22
23
 
23
- - ruby: "jruby-9.2.13.0"
24
- gemfile: activerecord_master
24
+ - ruby: "2.6"
25
+ gemfile: "activerecord_master"
26
+
27
+ - ruby: "2.5"
28
+ gemfile: "activerecord_7.0"
29
+
30
+ - ruby: "2.6"
31
+ gemfile: "activerecord_7.0"
32
+
33
+ - ruby: "jruby-9.3.1.0"
34
+ gemfile: "activerecord_7.0"
35
+
36
+ - ruby: "jruby-9.3.1.0"
37
+ gemfile: "activerecord_master"
25
38
 
26
39
  runs-on: ubuntu-latest
27
40
  env:
data/Appraisals CHANGED
@@ -6,6 +6,10 @@ appraise "activerecord-6.0" do
6
6
  gem "activerecord", "~> 6.0.0"
7
7
  end
8
8
 
9
+ appraise "activerecord-7.0" do
10
+ gem "activerecord", "~> 7.0.0"
11
+ end
12
+
9
13
  appraise "activerecord-master" do
10
- gem "activerecord", github: 'rails/rails'
14
+ gem "activerecord", github: 'rails/rails', branch: :main
11
15
  end
data/CHANGES.md CHANGED
@@ -1,6 +1,19 @@
1
1
  Unreleased
2
2
  ----------
3
3
 
4
+ 0.9.0 (2023-03-10)
5
+ -----------
6
+
7
+ - Add support to BigSerial #119
8
+ - Add support to hstore #118
9
+ - Support Postgres type modifiers #117
10
+
11
+
12
+ 0.8.0 (2022-10-28)
13
+ -----------
14
+
15
+ - Add support for Rails 7. #111 #112
16
+
4
17
  0.7.0 (2021-01-18)
5
18
  -----------
6
19
 
data/Gemfile CHANGED
@@ -7,7 +7,6 @@ group :development, :test do
7
7
  gem 'rspec', '>= 1.2.9'
8
8
  gem 'rake'
9
9
  gem 'rdoc'
10
- gem 'pry-byebug'
11
10
  end
12
11
 
13
12
  group :development do
data/README.md ADDED
@@ -0,0 +1,157 @@
1
+ [<img src="https://badge.fury.io/rb/activerecord-nulldb-adapter.png" alt="Gem
2
+ Version" />](http://badge.fury.io/rb/activerecord-nulldb-adapter) [<img
3
+ src="https://codeclimate.com/github/nulldb/nulldb.png"
4
+ />](https://codeclimate.com/github/nulldb/nulldb) [<img
5
+ src="https://github.com/nulldb/nulldb/workflows/build/badge.svg?branch=master"
6
+ alt="Build Status" />](https://github.com/nulldb/nulldb/actions)
7
+
8
+ # The NullDB Connection Adapter Plugin
9
+
10
+ ## What
11
+
12
+ NullDB is the Null Object pattern as applied to ActiveRecord database
13
+ adapters. It is a database backend that translates database interactions into
14
+ no-ops. Using NullDB enables you to test your model business logic -
15
+ including `after_save` hooks - without ever touching a real database.
16
+
17
+ ## Compatibility
18
+
19
+ ### Ruby
20
+ Currently supported Ruby versions: MRI 2.5.x, 2.6.x, 2.7.x, 3.X.
21
+
22
+ Experimental support provided for: JRuby
23
+
24
+ ### ActiveRecord
25
+ Any version of ActiveRecord >= 5.2
26
+
27
+ It is tested against AR 5.2, 6.0, 6.1 and master branch.
28
+
29
+ ## Installation
30
+
31
+ gem install activerecord-nulldb-adapter
32
+
33
+ ## How
34
+
35
+ Once installed, NullDB can be used much like any other ActiveRecord database
36
+ adapter:
37
+
38
+ ActiveRecord::Base.establish_connection :adapter => :nulldb
39
+
40
+ NullDB needs to know where you keep your schema file in order to reflect table
41
+ metadata. By default it looks in RAILS_ROOT/db/schema.rb. You can override
42
+ that by setting the `schema` option:
43
+
44
+ ActiveRecord::Base.establish_connection :adapter => :nulldb,
45
+ :schema => 'foo/myschema.rb'
46
+
47
+ NullDB comes with RSpec integration. To replace the database with NullDB in
48
+ all of your specs, put the following in your spec/rails_helper:
49
+
50
+ require 'nulldb_rspec'
51
+ include NullDB::RSpec::NullifiedDatabase
52
+
53
+ after you load your rails environment
54
+
55
+ require File.expand_path('../config/environment', __dir__)
56
+
57
+ otherwise you will encounter issues such as
58
+ ([bug)](https://github.com/nulldb/nulldb/pull/90#issuecomment-496690958).
59
+
60
+ Or if you just want to use NullDB in a specific spec context, you can include
61
+ the same module inside a context:
62
+
63
+ require 'nulldb_rspec'
64
+
65
+ describe Employee, "with access to the database" do
66
+ fixtures :employees
67
+ # ...
68
+ end
69
+
70
+ describe Employee, "with NullDB" do
71
+ include NullDB::RSpec::NullifiedDatabase
72
+ # ...
73
+ end
74
+
75
+ If you want to have NullDB enabled by default but disabled for particular
76
+ contexts then (see this
77
+ [post)](https://web.archive.org/web/20120419204019/http://andywaite.com/2011/5
78
+ /18/rspec-disable-nulldb)
79
+
80
+ NullDB::Rspec provides some custom matcher support for verifying expectations
81
+ about interactions with the database:
82
+
83
+ describe Employee do
84
+ include NullDB::RSpec::NullifiedDatabase
85
+
86
+ it "should cause an insert statement to be executed" do
87
+ Employee.create!
88
+ Employee.connection.should have_executed(:insert)
89
+ end
90
+ end
91
+
92
+ UnitRecord-style verification that no database calls have been made at all can
93
+ be achieved by using the special `:anything` symbol:
94
+
95
+ describe "stuff that shouldn't touch the database" do
96
+ after :each do
97
+ Employee.connection.should_not have_executed(:anything)
98
+ end
99
+ # ...
100
+ end
101
+
102
+ You can also experiment with putting NullDB in your database.yml:
103
+
104
+ unit_test:
105
+ adapter: nulldb
106
+
107
+ However, due to the way Rails hard-codes specific database adapters into its
108
+ standard Rake tasks, you may find that this generates unexpected and
109
+ difficult-to-debug behavior. Workarounds for this are under development.
110
+
111
+ ## Why
112
+
113
+ There are a number of advantages to writing unit tests that never touch the
114
+ database. The biggest is probably speed of execution - unit tests must be
115
+ fast for test-driven development to be practical. Another is separation of
116
+ concerns: unit tests should be exercising only the business logic contained in
117
+ your models, not ActiveRecord. For more on why testing-sans-database is a good
118
+ idea, see:
119
+ http://www.dcmanges.com/blog/rails-unit-record-test-without-the-database.
120
+
121
+ NullDB is one way to separate your unit tests from the database. It was
122
+ inspired by the [ARBS](http://arbs.rubyforge.org/) and
123
+ [UnitRecord](http://unit-test-ar.rubyforge.org/) libraries. It differs from
124
+ them in that rather than modifying parts of ActiveRecord, it implements the
125
+ same [semi-]well-documented public interface that the other standard database
126
+ adapters, like MySQL and SQLServer, implement. This has enabled it to evolve
127
+ to support new ActiveRecord versions relatively easily.
128
+
129
+ One concrete advantage of this null-object pattern design is that it is
130
+ possible with NullDB to test `after_save` hooks. With NullDB, you can call
131
+ `#save` and all of the usual callbacks will be called - but nothing will be
132
+ saved.
133
+
134
+ ## Limitations
135
+
136
+ * It is **not** an in-memory database. Finds will not work. Neither will
137
+ `reload`, currently. Test fixtures won't work either, for obvious
138
+ reasons.
139
+ * It has only the most rudimentery schema/migration support. Complex
140
+ migrations will probably break it.
141
+ * Lots of other things probably don't work. Patches welcome!
142
+
143
+
144
+ ## Who
145
+
146
+ NullDB was originally written by Avdi Grimm <mailto:avdi@avdi.org>. It is
147
+ currently maintained by [Danilo Cabello](https://github.com/cabello).
148
+ Previously maintained by: [Bram de Vries](https://github.com/blaet).
149
+
150
+ ## Where
151
+
152
+ * Homepage: https://github.com/nulldb/nulldb
153
+
154
+
155
+ ## License
156
+
157
+ See the LICENSE file for licensing information.
data/Rakefile CHANGED
@@ -9,6 +9,6 @@ task :default => :spec
9
9
 
10
10
  require 'rdoc/task'
11
11
  Rake::RDocTask.new do |rd|
12
- rd.main = "README.rdoc"
13
- rd.rdoc_files.include("README.rdoc", "LICENSE", "lib/**/*.rb")
12
+ rd.main = "README.md"
13
+ rd.rdoc_files.include("README.md", "LICENSE", "lib/**/*.rb")
14
14
  end
@@ -14,13 +14,13 @@ Gem::Specification.new do |s|
14
14
  s.email = "cabello@users.noreply.github.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.md"
18
18
  ]
19
19
  s.files = `git ls-files`.split($/)
20
20
  s.homepage = "https://github.com/nulldb/nulldb"
21
21
  s.licenses = ["MIT"]
22
22
 
23
- s.add_runtime_dependency 'activerecord', '>= 5.2.0', '< 6.3'
23
+ s.add_runtime_dependency 'activerecord', '>= 5.2.0', '< 7.1'
24
24
  s.add_development_dependency 'spec'
25
25
  s.add_development_dependency 'rdoc'
26
26
  s.add_development_dependency 'rspec'
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 7.0.0"
6
+
7
+ group :development, :test do
8
+ gem "spec"
9
+ gem "rspec", ">= 1.2.9"
10
+ gem "rake"
11
+ gem "rdoc"
12
+ end
13
+
14
+ group :development do
15
+ gem "appraisal"
16
+ gem "simplecov", require: false
17
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", github: "rails/rails"
5
+ gem "activerecord", github: "rails/rails", branch: :main
6
6
 
7
7
  group :development, :test do
8
8
  gem "spec"
@@ -98,7 +98,7 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
98
98
  end
99
99
 
100
100
  # Rails 6.1+
101
- if ActiveRecord::VERSION::MAJOR >= 6 and ActiveRecord::VERSION::MINOR > 0
101
+ if ActiveRecord::VERSION::MAJOR >= 7 || (ActiveRecord::VERSION::MAJOR >= 6 and ActiveRecord::VERSION::MINOR > 0)
102
102
  def remove_index(table_name, column_name = nil, **options )
103
103
  index_name = index_name_for_remove(table_name, column_name, options)
104
104
  index = @indexes[table_name].reject! { |index| index.name == index_name }
@@ -264,7 +264,7 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
264
264
 
265
265
  protected
266
266
 
267
- def select(statement, name = nil, binds = [])
267
+ def select(statement, name = nil, binds = [], prepare: nil, async: nil)
268
268
  EmptyResult.new.tap do |r|
269
269
  r.bind_column_meta(columns_for(name))
270
270
  self.execution_log << Statement.new(entry_point, statement)
@@ -313,7 +313,7 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
313
313
 
314
314
  def new_table_definition(adapter = nil, table_name = nil, is_temporary = nil, options = {})
315
315
  case ::ActiveRecord::VERSION::MAJOR
316
- when 6
316
+ when 6, 7
317
317
  TableDefinition.new(self, table_name, temporary: is_temporary, options: options.except(:id))
318
318
  when 5
319
319
  TableDefinition.new(table_name, is_temporary, options.except(:id), nil)
@@ -343,13 +343,37 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
343
343
  [nil, @logger, @config]
344
344
  end
345
345
 
346
+ # Register types only once to avoid ActiveRecord::TypeConflictError
347
+ # in ActiveRecord::Type::Registration#<=>
348
+ REGISTRATION_MUTEX = Mutex.new
349
+
346
350
  def register_types
347
- require 'active_model/type'
351
+ REGISTRATION_MUTEX.synchronize do
352
+ return if self.class.types_registered
353
+
354
+ self.class.types_registered = true
355
+ end
356
+
348
357
  ActiveRecord::Type.register(
349
358
  :primary_key,
350
359
  ActiveModel::Type::Integer,
351
360
  adapter: adapter_name,
352
361
  override: true
353
362
  )
363
+
364
+ ActiveRecord::Type.add_modifier({ array: true }, DummyOID, adapter: :nulldb)
365
+ ActiveRecord::Type.add_modifier({ range: true }, DummyOID, adapter: :nulldb)
366
+ end
367
+
368
+ class << self
369
+ attr_accessor :types_registered
370
+ end
371
+
372
+ class DummyOID < ActiveModel::Type::Value
373
+ attr_reader :subtype
374
+
375
+ def initialize(*args)
376
+ @subtype = args.first
377
+ end
354
378
  end
355
379
  end
@@ -6,6 +6,10 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter
6
6
  alias_method :citext, :text
7
7
  alias_method :interval, :text
8
8
  alias_method :geometry, :text
9
+ alias_method :serial, :integer
10
+ alias_method :bigserial, :integer
11
+ alias_method :inet, :string
9
12
  alias_method :jsonb, :json if method_defined? :json
13
+ alias_method :hstore, :json
10
14
  end
11
15
  end
@@ -1,3 +1,3 @@
1
1
  module NullDB
2
- VERSION = "0.7.0"
2
+ VERSION = "0.9.0"
3
3
  end
data/spec/nulldb_spec.rb CHANGED
@@ -490,6 +490,7 @@ describe 'adapter-specific extensions' do
490
490
  t.interval :time_interval
491
491
  t.geometry :feature_geometry, srid: 4326, type: "multi_polygon"
492
492
  t.jsonb :jsonb_column
493
+ t.hstore :hstore_column
493
494
  end
494
495
  end
495
496
  }.to_not raise_error
@@ -503,6 +504,20 @@ describe 'adapter-specific extensions' do
503
504
  should_have_column(ExtendedModel, :jsonb_column, :json)
504
505
  end
505
506
 
507
+ it 'supports ActiveModel attributes with postgres modifiers' do
508
+ class ExtendedModel < ActiveRecord::Base
509
+ attribute :strings, :string, array: true
510
+ attribute :size, :integer, range: true
511
+ end
512
+
513
+ expect(ExtendedModel.type_for_attribute(:strings))
514
+ .to be_a ActiveRecord::ConnectionAdapters::NullDBAdapter::DummyOID
515
+ expect(ExtendedModel.new(strings: %w[a b]).strings).to eq %w[a b]
516
+ expect(ExtendedModel.type_for_attribute(:size))
517
+ .to be_a ActiveRecord::ConnectionAdapters::NullDBAdapter::DummyOID
518
+ expect(ExtendedModel.new(size: 1..5).size).to eq 1..5
519
+ end
520
+
506
521
  it 'registers a primary_key type' do
507
522
  expect(ActiveRecord::Type.lookup(:primary_key, adapter: 'NullDB'))
508
523
  .to be_a(ActiveModel::Type::Integer)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-nulldb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Avdi Grimm
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-01-18 00:00:00.000000000 Z
13
+ date: 2023-03-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 5.2.0
22
22
  - - "<"
23
23
  - !ruby/object:Gem::Version
24
- version: '6.3'
24
+ version: '7.1'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
@@ -31,7 +31,7 @@ dependencies:
31
31
  version: 5.2.0
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: '6.3'
34
+ version: '7.1'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: spec
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -138,7 +138,7 @@ executables: []
138
138
  extensions: []
139
139
  extra_rdoc_files:
140
140
  - LICENSE
141
- - README.rdoc
141
+ - README.md
142
142
  files:
143
143
  - ".github/workflows/ruby.yml"
144
144
  - ".gitignore"
@@ -146,12 +146,13 @@ files:
146
146
  - CHANGES.md
147
147
  - Gemfile
148
148
  - LICENSE
149
- - README.rdoc
149
+ - README.md
150
150
  - Rakefile
151
151
  - activerecord-nulldb-adapter.gemspec
152
152
  - gemfiles/activerecord_5.2.gemfile
153
153
  - gemfiles/activerecord_6.0.gemfile
154
154
  - gemfiles/activerecord_6.1.gemfile
155
+ - gemfiles/activerecord_7.0.gemfile
155
156
  - gemfiles/activerecord_master.gemfile
156
157
  - lib/active_record/connection_adapters/nulldb_adapter.rb
157
158
  - lib/active_record/connection_adapters/nulldb_adapter/checkpoint.rb
@@ -194,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
195
  - !ruby/object:Gem::Version
195
196
  version: '0'
196
197
  requirements: []
197
- rubygems_version: 3.0.3
198
+ rubygems_version: 3.3.26
198
199
  signing_key:
199
200
  specification_version: 4
200
201
  summary: The Null Object pattern as applied to ActiveRecord database adapters
data/README.rdoc DELETED
@@ -1,154 +0,0 @@
1
- {<img src="https://badge.fury.io/rb/activerecord-nulldb-adapter.png" alt="Gem Version" />}[http://badge.fury.io/rb/activerecord-nulldb-adapter]
2
- {<img src="https://codeclimate.com/github/nulldb/nulldb.png" />}[https://codeclimate.com/github/nulldb/nulldb]
3
- {<img src="https://github.com/nulldb/nulldb/workflows/build/badge.svg?branch=master" alt="Build Status" />}[https://github.com/nulldb/nulldb/actions]
4
-
5
-
6
- = The NullDB Connection Adapter Plugin
7
-
8
- == What
9
-
10
- NullDB is the Null Object pattern as applied to ActiveRecord database
11
- adapters. It is a database backend that translates database
12
- interactions into no-ops. Using NullDB enables you to test your model
13
- business logic - including +after_save+ hooks - without ever touching
14
- a real database.
15
-
16
- == Compatibility
17
-
18
- === Ruby
19
- Currently supported Ruby versions: MRI 2.5.x, 2.6.x, 2.7.x, 3.X.
20
-
21
- Experimental support provided for: JRuby
22
-
23
- === ActiveRecord
24
- Any version of ActiveRecord >= 5.2
25
-
26
- It is tested against AR 5.2, 6.0, 6.1 and master branch.
27
-
28
- == Installation
29
-
30
- gem install activerecord-nulldb-adapter
31
-
32
- == How
33
-
34
- Once installed, NullDB can be used much like any other ActiveRecord
35
- database adapter:
36
-
37
- ActiveRecord::Base.establish_connection :adapter => :nulldb
38
-
39
- NullDB needs to know where you keep your schema file in order to
40
- reflect table metadata. By default it looks in
41
- RAILS_ROOT/db/schema.rb. You can override that by setting the
42
- +schema+ option:
43
-
44
- ActiveRecord::Base.establish_connection :adapter => :nulldb,
45
- :schema => 'foo/myschema.rb'
46
-
47
- NullDB comes with RSpec integration. To replace the database with
48
- NullDB in all of your specs, put the following in your
49
- spec/rails_helper:
50
-
51
- require 'nulldb_rspec'
52
- include NullDB::RSpec::NullifiedDatabase
53
-
54
- after you load your rails environment
55
-
56
- require File.expand_path('../config/environment', __dir__)
57
-
58
- otherwise you will encounter issues such as (bug)[https://github.com/nulldb/nulldb/pull/90#issuecomment-496690958].
59
-
60
- Or if you just want to use NullDB in a specific spec context, you can
61
- include the same module inside a context:
62
-
63
- require 'nulldb_rspec'
64
-
65
- describe Employee, "with access to the database" do
66
- fixtures :employees
67
- # ...
68
- end
69
-
70
- describe Employee, "with NullDB" do
71
- include NullDB::RSpec::NullifiedDatabase
72
- # ...
73
- end
74
-
75
- If you want to have NullDB enabled by default but disabled for particular contexts then (see this post)[https://web.archive.org/web/20120419204019/http://andywaite.com/2011/5/18/rspec-disable-nulldb]
76
-
77
- NullDB::Rspec provides some custom matcher support for verifying
78
- expectations about interactions with the database:
79
-
80
- describe Employee do
81
- include NullDB::RSpec::NullifiedDatabase
82
-
83
- it "should cause an insert statement to be executed" do
84
- Employee.create!
85
- Employee.connection.should have_executed(:insert)
86
- end
87
- end
88
-
89
- UnitRecord-style verification that no database calls have been made at
90
- all can be achieved by using the special +:anything+ symbol:
91
-
92
- describe "stuff that shouldn't touch the database" do
93
- after :each do
94
- Employee.connection.should_not have_executed(:anything)
95
- end
96
- # ...
97
- end
98
-
99
- You can also experiment with putting NullDB in your database.yml:
100
-
101
- unit_test:
102
- adapter: nulldb
103
-
104
- However, due to the way Rails hard-codes specific database adapters
105
- into its standard Rake tasks, you may find that this generates
106
- unexpected and difficult-to-debug behavior. Workarounds for this are
107
- under development.
108
-
109
- == Why
110
-
111
- There are a number of advantages to writing unit tests that never
112
- touch the database. The biggest is probably speed of execution - unit
113
- tests must be fast for test-driven development to be practical.
114
- Another is separation of concerns: unit tests should be exercising
115
- only the business logic contained in your models, not ActiveRecord.
116
- For more on why testing-sans-database is a good idea, see:
117
- http://www.dcmanges.com/blog/rails-unit-record-test-without-the-database.
118
-
119
- NullDB is one way to separate your unit tests from the database. It
120
- was inspired by the ARBS[http://arbs.rubyforge.org/] and
121
- UnitRecord[http://unit-test-ar.rubyforge.org/] libraries. It differs
122
- from them in that rather than modifying parts of ActiveRecord, it
123
- implements the same [semi-]well-documented public interface that the
124
- other standard database adapters, like MySQL and SQLServer,
125
- implement. This has enabled it to evolve to support new ActiveRecord
126
- versions relatively easily.
127
-
128
- One concrete advantage of this null-object pattern design is that it
129
- is possible with NullDB to test +after_save+ hooks. With NullDB, you
130
- can call +#save+ and all of the usual callbacks will be called - but
131
- nothing will be saved.
132
-
133
- == Limitations
134
-
135
- * It is *not* an in-memory database. Finds will not work. Neither
136
- will +reload+, currently. Test fixtures won't work either, for
137
- obvious reasons.
138
- * It has only the most rudimentery schema/migration support. Complex
139
- migrations will probably break it.
140
- * Lots of other things probably don't work. Patches welcome!
141
-
142
- == Who
143
-
144
- NullDB was originally written by Avdi Grimm <mailto:avdi@avdi.org>.
145
- It is currently maintained by {Danilo Cabello}[https://github.com/cabello].
146
- Previously maintained by: {Bram de Vries}[https://github.com/blaet].
147
-
148
- == Where
149
-
150
- * Homepage: https://github.com/nulldb/nulldb
151
-
152
- == License
153
-
154
- See the LICENSE file for licensing information.