gimme 0.1.7 → 0.1.8

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.
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - jruby-18mode # JRuby in 1.8 mode
7
+ - jruby-19mode # JRuby in 1.9 mode
8
+ - rbx-18mode
9
+ # - rbx-19mode
10
+ - ree
data/Gemfile CHANGED
@@ -3,9 +3,18 @@ source "http://rubygems.org"
3
3
 
4
4
  # Add dependencies to develop your gem here.
5
5
  # Include everything needed to run rake, tests, features, etc.
6
- group :development do
7
- gem "bundler", "~> 1.0.0"
6
+ group :development, :test do
7
+ gem 'rdoc'
8
+
8
9
  gem "jeweler", "~> 1.5.2"
9
- gem "rspec", ">= 1.3.1"
10
- gem "cucumber", ">= 0.10.0"
10
+ gem "rspec"
11
+ gem "rspec-given"
12
+ gem "guard-rspec", :require => false
13
+ gem "cucumber"
14
+ gem "guard-cucumber", :require => false
15
+ gem "simplecov", :require => false
16
+ if RUBY_PLATFORM =~ /darwin/i
17
+ gem "growl_notify"
18
+ gem "rb-fsevent", :require => false
19
+ end
11
20
  end
data/Gemfile.lock CHANGED
@@ -2,37 +2,66 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  builder (3.0.0)
5
- cucumber (0.10.0)
5
+ cucumber (1.1.9)
6
6
  builder (>= 2.1.2)
7
- diff-lcs (~> 1.1.2)
8
- gherkin (~> 2.3.2)
9
- json (~> 1.4.6)
10
- term-ansicolor (~> 1.0.5)
11
- diff-lcs (1.1.2)
12
- gherkin (2.3.3)
13
- json (~> 1.4.6)
7
+ diff-lcs (>= 1.1.2)
8
+ gherkin (~> 2.9.0)
9
+ json (>= 1.4.6)
10
+ term-ansicolor (>= 1.0.6)
11
+ diff-lcs (1.1.3)
12
+ ffi (1.0.11)
13
+ gherkin (2.9.0)
14
+ json (>= 1.4.6)
14
15
  git (1.2.5)
16
+ growl_notify (0.0.3)
17
+ rb-appscript
18
+ guard (1.0.0)
19
+ ffi (>= 0.5.0)
20
+ thor (~> 0.14.6)
21
+ guard-cucumber (0.7.5)
22
+ cucumber (>= 0.10)
23
+ guard (>= 0.8.3)
24
+ guard-rspec (0.6.0)
25
+ guard (>= 0.10.0)
15
26
  jeweler (1.5.2)
16
27
  bundler (~> 1.0.0)
17
28
  git (>= 1.2.5)
18
29
  rake
19
- json (1.4.6)
20
- rake (0.8.7)
21
- rspec (2.4.0)
22
- rspec-core (~> 2.4.0)
23
- rspec-expectations (~> 2.4.0)
24
- rspec-mocks (~> 2.4.0)
25
- rspec-core (2.4.0)
26
- rspec-expectations (2.4.0)
30
+ json (1.6.5)
31
+ multi_json (1.1.0)
32
+ rake (0.9.2.2)
33
+ rb-appscript (0.6.1)
34
+ rb-fsevent (0.9.0)
35
+ rdoc (3.12)
36
+ json (~> 1.4)
37
+ rspec (2.8.0)
38
+ rspec-core (~> 2.8.0)
39
+ rspec-expectations (~> 2.8.0)
40
+ rspec-mocks (~> 2.8.0)
41
+ rspec-core (2.8.0)
42
+ rspec-expectations (2.8.0)
27
43
  diff-lcs (~> 1.1.2)
28
- rspec-mocks (2.4.0)
29
- term-ansicolor (1.0.5)
44
+ rspec-given (1.4.2)
45
+ rspec (> 1.2.8)
46
+ rspec-mocks (2.8.0)
47
+ simplecov (0.6.1)
48
+ multi_json (~> 1.0)
49
+ simplecov-html (~> 0.5.3)
50
+ simplecov-html (0.5.3)
51
+ term-ansicolor (1.0.7)
52
+ thor (0.14.6)
30
53
 
31
54
  PLATFORMS
32
55
  ruby
33
56
 
34
57
  DEPENDENCIES
35
- bundler (~> 1.0.0)
36
- cucumber (>= 0.10.0)
58
+ cucumber
59
+ growl_notify
60
+ guard-cucumber
61
+ guard-rspec
37
62
  jeweler (~> 1.5.2)
38
- rspec (>= 1.3.1)
63
+ rb-fsevent
64
+ rdoc
65
+ rspec
66
+ rspec-given
67
+ simplecov
data/Guardfile ADDED
@@ -0,0 +1,15 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :cli => '--color', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
10
+
11
+ guard 'cucumber' do
12
+ watch(%r{^features/.+\.feature$})
13
+ watch(%r{^features/support/.+$}) { 'features' }
14
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
15
+ end
data/README.markdown CHANGED
@@ -1,10 +1,10 @@
1
1
  # Gimme
2
2
 
3
- Gimme is a very lightweight test double library for ruby. Written to be an opinionated (but not noisy) means to facilitate test-driving by enabling the author to specifying only what matters. But if could only feed Google one thing at this point, it would be: "[Mockito](http://mockito.org/) for Ruby"
3
+ Gimme is a very lightweight test double library for ruby. Written to be an opinionated (but not noisy) means to facilitate test-driving by enabling the author to specify only what she cares about. If I could only feed Google one thing at this point, it would be: "[Mockito](http://mockito.org/) for Ruby"
4
4
 
5
5
  You can read the (possibly stale) documentation below or the (fresh) [gimme Cucumber features on Relish](http://relishapp.com/searls/gimme)
6
6
 
7
- And here's a [blog post outlining the case for gimme](http://dougu.tumblr.com/post/6144302027/whats-wrong-with-rubys-test-doubles).
7
+ And here's a [blog post outlining the case for gimme](http://searls.test-double.com/2011/06/03/whats-wrong-with-rubys-test-doubles/).
8
8
 
9
9
  ## Basics (or "What does it Gimme?" ... har.)
10
10
 
data/Rakefile CHANGED
@@ -28,15 +28,8 @@ Jeweler::Tasks.new do |gem|
28
28
  end
29
29
  Jeweler::RubygemsDotOrgTasks.new
30
30
 
31
- require 'cucumber/rake/task'
32
- Cucumber::Rake::Task.new do |t|
33
- t.cucumber_opts = %w{--format pretty}
34
- end
35
-
36
- task :default => :cucumber
37
-
38
- require 'rake/rdoctask'
39
- Rake::RDocTask.new do |rdoc|
31
+ require 'rdoc/task'
32
+ RDoc::Task.new do |rdoc|
40
33
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
34
 
42
35
  rdoc.rdoc_dir = 'rdoc'
@@ -44,3 +37,13 @@ Rake::RDocTask.new do |rdoc|
44
37
  rdoc.rdoc_files.include('README*')
45
38
  rdoc.rdoc_files.include('lib/**/*.rb')
46
39
  end
40
+
41
+ require 'cucumber/rake/task'
42
+ Cucumber::Rake::Task.new do |t|
43
+ t.cucumber_opts = %w{--format progress}
44
+ end
45
+
46
+ require 'rspec/core/rake_task'
47
+ RSpec::Core::RakeTask.new
48
+
49
+ task :default => [:spec,:cucumber]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -94,7 +94,7 @@ end
94
94
  # private
95
95
 
96
96
  def send_and_trap_error(error_type,target,method,args=nil,result=nil)
97
- begin
97
+ begin
98
98
  sendish(target,method,args,result)
99
99
  rescue error_type => e
100
100
  @error = e
data/gimme.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gimme}
8
- s.version = "0.1.7"
8
+ s.version = "0.1.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Justin Searls"]
12
- s.date = %q{2011-06-04}
11
+ s.authors = [%q{Justin Searls}]
12
+ s.date = %q{2012-02-25}
13
13
  s.description = %q{gimme attempts to bring to Ruby a test double workflow akin to Mockito in Java. Major distinctions include preserving arrange-act-assert in tests, fast feedback for methods the double's real counterpart may not know how to respond to, no string/symbolic representations of methods, argument captors, and strong opinions (weakly held). }
14
14
  s.email = %q{searls@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -18,10 +18,11 @@ Gem::Specification.new do |s|
18
18
  "README.rdoc"
19
19
  ]
20
20
  s.files = [
21
- ".bundle/config",
22
21
  ".document",
22
+ ".travis.yml",
23
23
  "Gemfile",
24
24
  "Gemfile.lock",
25
+ "Guardfile",
25
26
  "LICENSE.txt",
26
27
  "README.markdown",
27
28
  "README.rdoc",
@@ -47,38 +48,73 @@ Gem::Specification.new do |s|
47
48
  "lib/gimme/gives.rb",
48
49
  "lib/gimme/matchers.rb",
49
50
  "lib/gimme/method_resolver.rb",
51
+ "lib/gimme/rspec_adapter.rb",
50
52
  "lib/gimme/test_double.rb",
51
- "lib/gimme/verifies.rb"
53
+ "lib/gimme/verifies.rb",
54
+ "spec/gimme/captor_spec.rb",
55
+ "spec/gimme/errors_spec.rb",
56
+ "spec/gimme/gives_spec.rb",
57
+ "spec/gimme/matchers_spec.rb",
58
+ "spec/gimme/test_double_spec.rb",
59
+ "spec/gimme/verifies_spec.rb",
60
+ "spec/spec_helper.rb"
52
61
  ]
53
62
  s.homepage = %q{http://github.com/searls/gimme}
54
- s.licenses = ["MIT"]
55
- s.require_paths = ["lib"]
56
- s.rubygems_version = %q{1.4.2}
63
+ s.licenses = [%q{MIT}]
64
+ s.require_paths = [%q{lib}]
65
+ s.rubygems_version = %q{1.8.6}
57
66
  s.summary = %q{gimme — a low-specification test double library for Ruby}
67
+ s.test_files = [
68
+ "spec/gimme/captor_spec.rb",
69
+ "spec/gimme/errors_spec.rb",
70
+ "spec/gimme/gives_spec.rb",
71
+ "spec/gimme/matchers_spec.rb",
72
+ "spec/gimme/test_double_spec.rb",
73
+ "spec/gimme/verifies_spec.rb",
74
+ "spec/spec_helper.rb"
75
+ ]
58
76
 
59
77
  if s.respond_to? :specification_version then
60
78
  s.specification_version = 3
61
79
 
62
80
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
81
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
64
82
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
65
- s.add_development_dependency(%q<rspec>, [">= 1.3.1"])
66
- s.add_development_dependency(%q<cucumber>, [">= 0.10.0"])
83
+ s.add_development_dependency(%q<rspec>, [">= 0"])
84
+ s.add_development_dependency(%q<rspec-given>, [">= 0"])
85
+ s.add_development_dependency(%q<guard-rspec>, [">= 0"])
86
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
87
+ s.add_development_dependency(%q<guard-cucumber>, [">= 0"])
88
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
89
+ s.add_development_dependency(%q<growl_notify>, [">= 0"])
90
+ s.add_development_dependency(%q<rb-fsevent>, [">= 0"])
67
91
  s.add_development_dependency(%q<rspec>, [">= 1.3.1"])
68
92
  s.add_development_dependency(%q<cucumber>, [">= 0.10.0"])
69
93
  else
70
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
94
+ s.add_dependency(%q<rdoc>, [">= 0"])
71
95
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
72
- s.add_dependency(%q<rspec>, [">= 1.3.1"])
73
- s.add_dependency(%q<cucumber>, [">= 0.10.0"])
96
+ s.add_dependency(%q<rspec>, [">= 0"])
97
+ s.add_dependency(%q<rspec-given>, [">= 0"])
98
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
99
+ s.add_dependency(%q<cucumber>, [">= 0"])
100
+ s.add_dependency(%q<guard-cucumber>, [">= 0"])
101
+ s.add_dependency(%q<simplecov>, [">= 0"])
102
+ s.add_dependency(%q<growl_notify>, [">= 0"])
103
+ s.add_dependency(%q<rb-fsevent>, [">= 0"])
74
104
  s.add_dependency(%q<rspec>, [">= 1.3.1"])
75
105
  s.add_dependency(%q<cucumber>, [">= 0.10.0"])
76
106
  end
77
107
  else
78
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
108
+ s.add_dependency(%q<rdoc>, [">= 0"])
79
109
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
80
- s.add_dependency(%q<rspec>, [">= 1.3.1"])
81
- s.add_dependency(%q<cucumber>, [">= 0.10.0"])
110
+ s.add_dependency(%q<rspec>, [">= 0"])
111
+ s.add_dependency(%q<rspec-given>, [">= 0"])
112
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
113
+ s.add_dependency(%q<cucumber>, [">= 0"])
114
+ s.add_dependency(%q<guard-cucumber>, [">= 0"])
115
+ s.add_dependency(%q<simplecov>, [">= 0"])
116
+ s.add_dependency(%q<growl_notify>, [">= 0"])
117
+ s.add_dependency(%q<rb-fsevent>, [">= 0"])
82
118
  s.add_dependency(%q<rspec>, [">= 1.3.1"])
83
119
  s.add_dependency(%q<cucumber>, [">= 0.10.0"])
84
120
  end
@@ -15,7 +15,7 @@ module Gimme
15
15
  Gimme::Matchers::Anything.new
16
16
  end
17
17
 
18
- class IsA < Matcher
18
+ class IsA < Matcher
19
19
  def initialize(cls)
20
20
  @cls = cls
21
21
  end
@@ -0,0 +1,12 @@
1
+ module Gimme
2
+ module RSpecAdapter
3
+ def setup_mocks_for_rspec
4
+ end
5
+
6
+ def verify_mocks_for_rspec
7
+ end
8
+
9
+ def teardown_mocks_for_rspec
10
+ end
11
+ end
12
+ end
@@ -27,7 +27,16 @@ module Gimme
27
27
  end
28
28
 
29
29
  if invoked != @times
30
- raise Errors::VerificationFailedError.new("expected #{sym} to have been called with #{args}")
30
+ msg = "expected #{@double.cls.to_s}##{sym} to have been called with arguments #{args}"
31
+ if !@double.invocations[sym] || @double.invocations[sym].empty?
32
+ msg << "\n but was never called"
33
+ else
34
+ msg = @double.invocations[sym].inject msg do |memo, actual|
35
+ memo + "\n was actually called #{actual[1]} times with arguments #{actual[0]}"
36
+ end
37
+ end
38
+
39
+ raise Errors::VerificationFailedError.new(msg)
31
40
  end
32
41
  end
33
42
  end
data/lib/gimme.rb CHANGED
@@ -5,6 +5,8 @@ require 'gimme/gives'
5
5
  require 'gimme/verifies'
6
6
  require 'gimme/matchers'
7
7
  require 'gimme/captor'
8
+ require 'gimme/rspec_adapter'
8
9
 
9
10
  include Gimme
10
- include Gimme::Matchers
11
+ include Gimme::Matchers
12
+
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe Gimme::Captor do
5
+ describe "#value" do
6
+ Given(:captor) { Captor.new }
7
+ When { captor.value = "panda" }
8
+ Then { captor.value.should == "panda" }
9
+ end
10
+ end
11
+
12
+ describe Gimme::Matchers::Capture do
13
+ Given(:captor) { Captor.new }
14
+
15
+ shared_examples_for "an argument captor" do
16
+ describe "#matches?" do
17
+ When(:result) { a_capture.matches?("anything at all") }
18
+ Then { result.should == true }
19
+ Then { captor.value.should == "anything at all" }
20
+ end
21
+ end
22
+
23
+ context "using the class API" do
24
+ it_behaves_like "an argument captor" do
25
+ Given(:a_capture) { Capture.new(captor) }
26
+ end
27
+ end
28
+
29
+ context "using gimme DSL" do
30
+ it_behaves_like "an argument captor" do
31
+ Given(:a_capture) { capture(captor) }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gimme::Errors do
4
+ specify { Gimme::Errors::VerificationFailedError.kind_of? StandardError }
5
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gimme::Gives do
4
+ class Bunny
5
+ def nibble
6
+ end
7
+ end
8
+
9
+ shared_examples_for "a normal stubbing" do
10
+ context "stubbing an existing method" do
11
+ When { gives.nibble() { "nom" } }
12
+ Then { subject.nibble.should == "nom" }
13
+ end
14
+
15
+ context "stubbing a non-existent method" do
16
+ When(:stubbing) { lambda { gives.bark { "woof" } } }
17
+ Then { stubbing.should raise_error NoMethodError }
18
+ end
19
+ end
20
+
21
+ shared_examples_for "an overridden stubbing" do
22
+ context "configured to _not_ raise an error when stubbed method does not exist" do
23
+ Given { gives.raises_no_method_error =false }
24
+ When { gives.bark { "woof" } }
25
+ Then { subject.bark.should == "woof" }
26
+ end
27
+ end
28
+
29
+ context "using the class API" do
30
+ Given(:subject) { TestDouble.new(Bunny) }
31
+
32
+ it_behaves_like "a normal stubbing" do
33
+ Given(:gives) { Gives.new(subject) }
34
+ end
35
+
36
+ it_behaves_like "an overridden stubbing" do
37
+ Given(:gives) { Gives.new(subject) }
38
+ end
39
+ end
40
+
41
+ context "using the gimme DSL" do
42
+ Given(:subject) { gimme(Bunny) }
43
+
44
+ it_behaves_like "a normal stubbing" do
45
+ Given(:gives) { give(subject) }
46
+ end
47
+
48
+ it_behaves_like "an overridden stubbing" do
49
+ Given(:gives) { give!(subject) }
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec::Matchers.define :match do |expected|
4
+ match do |actual|
5
+ actual.matches?(expected)
6
+ end
7
+ end
8
+
9
+ describe Gimme::Matchers do
10
+ class Shoopuf
11
+ end
12
+
13
+ class BabyShoopuf < Shoopuf
14
+ end
15
+
16
+ describe Matcher do
17
+ context "a plain, default matcher" do
18
+ Given(:matcher) { Gimme::Matchers::Matcher.new }
19
+ Then { matcher.should_not match "anything" }
20
+ end
21
+ end
22
+
23
+ describe Anything do
24
+ shared_examples_for "an anything matcher" do
25
+ Then { matcher.should match "anything" }
26
+ end
27
+
28
+ context "class API" do
29
+ it_behaves_like "an anything matcher" do
30
+ Given(:matcher) { Anything.new }
31
+ end
32
+ end
33
+
34
+ context "gimme DSL" do
35
+ it_behaves_like "an anything matcher" do
36
+ Given(:matcher) { anything }
37
+ end
38
+ end
39
+ end
40
+
41
+ shared_examples_for "an identity matcher" do
42
+ Then { matcher.should match Shoopuf.new }
43
+ Then { matcher.should match BabyShoopuf.new }
44
+ end
45
+
46
+ shared_examples_for "a restrictive matcher" do
47
+ Then { matcher.should_not match nil }
48
+ Then { matcher.should_not match "Pandas" }
49
+ Then { matcher.should_not match Object.new }
50
+ Then { matcher.should_not match Class }
51
+ end
52
+
53
+ shared_examples_for "a relaxed matcher" do
54
+ Then { matcher.should match nil }
55
+ end
56
+
57
+
58
+ describe IsA do
59
+ context "class API" do
60
+ Given(:matcher) { IsA.new(Shoopuf) }
61
+ it_behaves_like "an identity matcher"
62
+ it_behaves_like "a restrictive matcher"
63
+ end
64
+
65
+ context "gimme DSL" do
66
+ Given(:matcher) { is_a(Shoopuf) }
67
+ it_behaves_like "an identity matcher"
68
+ it_behaves_like "a restrictive matcher"
69
+ end
70
+ end
71
+
72
+ describe Any do
73
+ context "class API" do
74
+ Given(:matcher) { Any.new(Shoopuf) }
75
+ it_behaves_like "an identity matcher"
76
+ it_behaves_like "a relaxed matcher"
77
+ end
78
+
79
+ context "gimme DSL" do
80
+ Given(:matcher) { any(Shoopuf) }
81
+ it_behaves_like "an identity matcher"
82
+ it_behaves_like "a relaxed matcher"
83
+ end
84
+ end
85
+
86
+ describe Gimme::Matchers::Numeric do
87
+ shared_examples_for "a numeric matcher" do
88
+ Then { matcher.should match 5 }
89
+ Then { matcher.should match 5.5 }
90
+ end
91
+
92
+ context "class API" do
93
+ Given(:matcher) { Gimme::Matchers::Numeric.new }
94
+ it_behaves_like "a numeric matcher"
95
+ it_behaves_like "a restrictive matcher"
96
+ end
97
+
98
+ context "gimme DSL" do
99
+ Given(:matcher) { numeric }
100
+ it_behaves_like "a numeric matcher"
101
+ it_behaves_like "a restrictive matcher"
102
+ end
103
+ end
104
+
105
+ describe Gimme::Matchers::Boolean do
106
+ shared_examples_for "a boolean matcher" do
107
+ Then { matcher.should match true }
108
+ Then { matcher.should match false }
109
+ Then { matcher.should_not match Boolean }
110
+ end
111
+
112
+ context "class API" do
113
+ Given(:matcher) { Gimme::Matchers::Boolean.new }
114
+ it_behaves_like "a boolean matcher"
115
+ it_behaves_like "a restrictive matcher"
116
+ end
117
+
118
+ context "gimme DSL" do
119
+ Given(:matcher) { boolean }
120
+ it_behaves_like "a boolean matcher"
121
+ it_behaves_like "a restrictive matcher"
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gimme::TestDouble do
4
+ class MassiveDamage
5
+ def boom
6
+ :asplode
7
+ end
8
+ end
9
+
10
+ describe "#gimme_next" do
11
+ Given(:test_double) { gimme_next(MassiveDamage) }
12
+ Given(:subject) { MassiveDamage.new }
13
+
14
+ Given { give(test_double).boom { :kaboom } }
15
+ When(:result) { subject.boom }
16
+ Then { result.should == :kaboom }
17
+
18
+ context "subsequent uses" do
19
+ Given(:next_subject) { MassiveDamage.new }
20
+ When(:next_result) { next_subject.boom }
21
+ Then { next_result.should == :asplode }
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gimme::Verifies do
4
+ class Natto
5
+ def ferment(beans=nil,time=nil)
6
+ end
7
+ end
8
+ Given(:test_double) { gimme(Natto) }
9
+
10
+ shared_examples_for "a verifier" do
11
+
12
+ context "invoked once when expected once" do
13
+ Given { test_double.ferment }
14
+ When(:result) { lambda { verifier.ferment } }
15
+ Then { result.should_not raise_error }
16
+ end
17
+
18
+ context "never invoked" do
19
+ When(:result) { lambda { verifier.ferment } }
20
+ Then { result.should raise_error Errors::VerificationFailedError }
21
+ Then do result.should raise_error Errors::VerificationFailedError,
22
+ "expected Natto#ferment to have been called with arguments #{[]}\n"+
23
+ " but was never called"
24
+ end
25
+ end
26
+
27
+ context "invoked with incorrect args" do
28
+ Given { test_double.ferment(5) }
29
+ When(:result) { lambda { verifier.ferment(4) } }
30
+ Then do result.should raise_error Errors::VerificationFailedError,
31
+ "expected Natto#ferment to have been called with arguments #{[4]}\n"+
32
+ " was actually called 1 times with arguments #{[5]}"
33
+ end
34
+ end
35
+
36
+ context "invoked incorrectly a whole bunch" do
37
+ Given { test_double.ferment(5) }
38
+ Given { test_double.ferment(5) }
39
+ Given { test_double.ferment(3) }
40
+ When(:result) { lambda { verifier.ferment(4) } }
41
+ Then do result.should raise_error Errors::VerificationFailedError,
42
+ /.* was actually called 2 times with arguments #{Regexp.escape([5].to_s)}.*/m
43
+ end
44
+ Then do result.should raise_error Errors::VerificationFailedError,
45
+ /.* was actually called 1 times with arguments #{Regexp.escape([3].to_s)}.*/m
46
+ end
47
+ end
48
+
49
+ context "invoked too few times" do
50
+ Given(:verifier) { Verifies.new(test_double,3) }
51
+ Given { 2.times { test_double.ferment } }
52
+ When(:result) { lambda { verifier.ferment } }
53
+ Then { result.should raise_error Errors::VerificationFailedError }
54
+ end
55
+
56
+ context "juggling multiple verifiers for the same method" do
57
+ Given(:multi_verifier) { Verifies.new(test_double,2) }
58
+ Given { test_double.ferment(:panda,:sauce) }
59
+ Given { 2.times { test_double.ferment(2,3) } }
60
+ When(:result) do
61
+ lambda do
62
+ multi_verifier.ferment(2,3)
63
+ verifier.ferment(:panda,:sauce)
64
+ end
65
+ end
66
+ Then { result.should_not raise_error }
67
+ end
68
+
69
+ context "a method not on the test_double" do
70
+ When(:result) { lambda { verifier.eat } }
71
+ Then { result.should raise_error NoMethodError }
72
+ end
73
+
74
+ context "a satisfied argument matcher" do
75
+ Given { test_double.ferment(5) }
76
+ When(:result) { lambda { verifier.ferment(numeric) } }
77
+ Then { result.should_not raise_error }
78
+ end
79
+
80
+ context "an unsatisifed argument matcher" do
81
+ Given { test_double.ferment("True") }
82
+ When(:result) { lambda { verifier.ferment(boolean) } }
83
+ Then { result.should raise_error Errors::VerificationFailedError }
84
+ end
85
+ end
86
+
87
+ shared_examples_for "an overridden verifier" do
88
+ context "a method not on the double that is invoked" do
89
+ Given { test_double.eat }
90
+ When(:result) { lambda { verifier.eat } }
91
+ Then { result.should_not raise_error }
92
+ end
93
+
94
+ context "a method not on the test_double that is _not_ invoked" do
95
+ When(:result) { lambda { verifier.eat } }
96
+ Then { result.should raise_error Errors::VerificationFailedError }
97
+ end
98
+ end
99
+
100
+ context "class API" do
101
+ Given(:verifier) { Verifies.new(test_double) }
102
+ it_behaves_like "a verifier"
103
+ it_behaves_like "an overridden verifier" do
104
+ Given { verifier.raises_no_method_error = false }
105
+ end
106
+ end
107
+
108
+ context "gimme DSL" do
109
+ it_behaves_like "a verifier" do
110
+ Given(:verifier) { verify(test_double) }
111
+ end
112
+
113
+ it_behaves_like "an overridden verifier" do
114
+ Given(:verifier) { verify!(test_double) }
115
+ end
116
+ end
117
+
118
+
119
+
120
+ end
@@ -0,0 +1,11 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter "/spec/"
4
+ end
5
+
6
+ require 'gimme'
7
+ require 'rspec/given'
8
+
9
+ RSpec.configure do |config|
10
+ config.mock_framework = Gimme::RSpecAdapter
11
+ end
metadata CHANGED
@@ -1,134 +1,166 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gimme
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.8
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 7
10
- version: 0.1.7
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Justin Searls
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-06-04 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- prerelease: false
23
- version_requirements: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-02-25 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rdoc
16
+ requirement: &903369690 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 23
29
- segments:
30
- - 1
31
- - 0
32
- - 0
33
- version: 1.0.0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
34
22
  type: :development
35
- requirement: *id001
36
- name: bundler
37
- - !ruby/object:Gem::Dependency
38
23
  prerelease: false
39
- version_requirements: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *903369690
25
+ - !ruby/object:Gem::Dependency
26
+ name: jeweler
27
+ requirement: &903369430 !ruby/object:Gem::Requirement
40
28
  none: false
41
- requirements:
29
+ requirements:
42
30
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 7
45
- segments:
46
- - 1
47
- - 5
48
- - 2
31
+ - !ruby/object:Gem::Version
49
32
  version: 1.5.2
50
33
  type: :development
51
- requirement: *id002
52
- name: jeweler
53
- - !ruby/object:Gem::Dependency
54
34
  prerelease: false
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *903369430
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &903369160 !ruby/object:Gem::Requirement
56
39
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 25
61
- segments:
62
- - 1
63
- - 3
64
- - 1
65
- version: 1.3.1
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
66
44
  type: :development
67
- requirement: *id003
68
- name: rspec
69
- - !ruby/object:Gem::Dependency
70
45
  prerelease: false
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *903369160
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-given
49
+ requirement: &903368910 !ruby/object:Gem::Requirement
72
50
  none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 55
77
- segments:
78
- - 0
79
- - 10
80
- - 0
81
- version: 0.10.0
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
82
55
  type: :development
83
- requirement: *id004
56
+ prerelease: false
57
+ version_requirements: *903368910
58
+ - !ruby/object:Gem::Dependency
59
+ name: guard-rspec
60
+ requirement: &903368650 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *903368650
69
+ - !ruby/object:Gem::Dependency
84
70
  name: cucumber
85
- - !ruby/object:Gem::Dependency
71
+ requirement: &903368400 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
86
78
  prerelease: false
87
- version_requirements: &id005 !ruby/object:Gem::Requirement
79
+ version_requirements: *903368400
80
+ - !ruby/object:Gem::Dependency
81
+ name: guard-cucumber
82
+ requirement: &903368120 !ruby/object:Gem::Requirement
88
83
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- hash: 25
93
- segments:
94
- - 1
95
- - 3
96
- - 1
97
- version: 1.3.1
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *903368120
91
+ - !ruby/object:Gem::Dependency
92
+ name: simplecov
93
+ requirement: &903367880 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *903367880
102
+ - !ruby/object:Gem::Dependency
103
+ name: growl_notify
104
+ requirement: &903367600 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *903367600
113
+ - !ruby/object:Gem::Dependency
114
+ name: rb-fsevent
115
+ requirement: &903367360 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
98
121
  type: :development
99
- requirement: *id005
122
+ prerelease: false
123
+ version_requirements: *903367360
124
+ - !ruby/object:Gem::Dependency
100
125
  name: rspec
101
- - !ruby/object:Gem::Dependency
126
+ requirement: &903367110 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.3.1
132
+ type: :development
102
133
  prerelease: false
103
- version_requirements: &id006 !ruby/object:Gem::Requirement
134
+ version_requirements: *903367110
135
+ - !ruby/object:Gem::Dependency
136
+ name: cucumber
137
+ requirement: &903366870 !ruby/object:Gem::Requirement
104
138
  none: false
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- hash: 55
109
- segments:
110
- - 0
111
- - 10
112
- - 0
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
113
142
  version: 0.10.0
114
143
  type: :development
115
- requirement: *id006
116
- name: cucumber
117
- description: "gimme attempts to bring to Ruby a test double workflow akin to Mockito in Java. Major distinctions include preserving arrange-act-assert in tests, fast feedback for methods the double's real counterpart may not know how to respond to, no string/symbolic representations of methods, argument captors, and strong opinions (weakly held). "
144
+ prerelease: false
145
+ version_requirements: *903366870
146
+ description: ! 'gimme attempts to bring to Ruby a test double workflow akin to Mockito
147
+ in Java. Major distinctions include preserving arrange-act-assert in tests, fast
148
+ feedback for methods the double''s real counterpart may not know how to respond
149
+ to, no string/symbolic representations of methods, argument captors, and strong
150
+ opinions (weakly held). '
118
151
  email: searls@gmail.com
119
152
  executables: []
120
-
121
153
  extensions: []
122
-
123
- extra_rdoc_files:
154
+ extra_rdoc_files:
124
155
  - LICENSE.txt
125
156
  - README.markdown
126
157
  - README.rdoc
127
- files:
128
- - .bundle/config
158
+ files:
129
159
  - .document
160
+ - .travis.yml
130
161
  - Gemfile
131
162
  - Gemfile.lock
163
+ - Guardfile
132
164
  - LICENSE.txt
133
165
  - README.markdown
134
166
  - README.rdoc
@@ -154,41 +186,49 @@ files:
154
186
  - lib/gimme/gives.rb
155
187
  - lib/gimme/matchers.rb
156
188
  - lib/gimme/method_resolver.rb
189
+ - lib/gimme/rspec_adapter.rb
157
190
  - lib/gimme/test_double.rb
158
191
  - lib/gimme/verifies.rb
159
- has_rdoc: true
192
+ - spec/gimme/captor_spec.rb
193
+ - spec/gimme/errors_spec.rb
194
+ - spec/gimme/gives_spec.rb
195
+ - spec/gimme/matchers_spec.rb
196
+ - spec/gimme/test_double_spec.rb
197
+ - spec/gimme/verifies_spec.rb
198
+ - spec/spec_helper.rb
160
199
  homepage: http://github.com/searls/gimme
161
- licenses:
200
+ licenses:
162
201
  - MIT
163
202
  post_install_message:
164
203
  rdoc_options: []
165
-
166
- require_paths:
204
+ require_paths:
167
205
  - lib
168
- required_ruby_version: !ruby/object:Gem::Requirement
206
+ required_ruby_version: !ruby/object:Gem::Requirement
169
207
  none: false
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- hash: 3
174
- segments:
208
+ requirements:
209
+ - - ! '>='
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ segments:
175
213
  - 0
176
- version: "0"
177
- required_rubygems_version: !ruby/object:Gem::Requirement
214
+ hash: -312263039
215
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
216
  none: false
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- hash: 3
183
- segments:
184
- - 0
185
- version: "0"
217
+ requirements:
218
+ - - ! '>='
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
186
221
  requirements: []
187
-
188
222
  rubyforge_project:
189
- rubygems_version: 1.4.2
223
+ rubygems_version: 1.8.6
190
224
  signing_key:
191
225
  specification_version: 3
192
- summary: "gimme \xE2\x80\x94\xC2\xA0a low-specification test double library for Ruby"
193
- test_files: []
194
-
226
+ summary: gimme — a low-specification test double library for Ruby
227
+ test_files:
228
+ - spec/gimme/captor_spec.rb
229
+ - spec/gimme/errors_spec.rb
230
+ - spec/gimme/gives_spec.rb
231
+ - spec/gimme/matchers_spec.rb
232
+ - spec/gimme/test_double_spec.rb
233
+ - spec/gimme/verifies_spec.rb
234
+ - spec/spec_helper.rb
data/.bundle/config DELETED
@@ -1,2 +0,0 @@
1
- ---
2
- BUNDLE_DISABLE_SHARED_GEMS: "1"