fakes-rspec 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ blah.rb
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
6
+ .rvmrc
7
+ .ruby-version
8
+ .ruby-gemset
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Jean-Paul S. Boodhoo
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,167 @@
1
+ #fakes-rspec
2
+
3
+ This is a library to aid in the usage of [fakes](http://github.com/developwithpassion/fakes) when using [RSpec](https://github.com/rspec/rspec). It adds a bunch of convienience methods and matchers to aid in the usage of the heavily AAA style isolation library.
4
+
5
+ ##Installation
6
+ ```bash
7
+ gem install fakes-rspec
8
+ ```
9
+ Or (preferably using bundler), in your gemfile:
10
+
11
+ ```ruby
12
+ source "http://rubygems.org"
13
+ gem 'fakes-rspec'
14
+ ```
15
+
16
+ When you install the gem it will install the rspec gem also, so you will be immediately ready to go.
17
+
18
+ ##Usage
19
+
20
+ ##Creating a fake
21
+
22
+ ###Using a let block
23
+ ```ruby
24
+ describe "Some Feature" do
25
+ let(:my_fake){fake}
26
+ end
27
+ ```
28
+
29
+ ###Inline
30
+ ```ruby
31
+ describe "Some Feature" do
32
+ it "should be able to create a fake" do
33
+ item = fake
34
+ end
35
+ end
36
+ ```
37
+ ##Configuring a fake with return values for calls
38
+
39
+ ###Irrespective of arguments:
40
+ ```ruby
41
+ it "should be able to setup a fakes return values" do
42
+ the_fake = fake
43
+ fake.stub(:hello).and_return("World")
44
+
45
+ fake.hello.should == "World"
46
+ fake.hello("There").should == "World"
47
+ end
48
+ ```
49
+
50
+ ###Caring about arguments:
51
+ ```ruby
52
+ it "should be able to setup a fakes return values" do
53
+ the_fake = fake
54
+ fake.stub(:hello).with("There").and_return("World")
55
+ fake.stub(:hello).with("You").and_return("Again")
56
+
57
+ fake.stub(:hello).and_return("Does Not Matter") # when you use the catch_all, make sure that it is the last step used for a particular method (as above)
58
+
59
+ fake.hello("There").should == "World"
60
+ fake.hello("You").should == "Again"
61
+ fake.hello.should == "Does Not Matter"
62
+ end
63
+ ```
64
+
65
+ ##Determining whether a call was made
66
+
67
+ One of the big strengths of this library compared to some of the other ruby isolation libraries is the ability to let you make assertions against the fake after the [subject] has run its code. The following examples demonstrate some typical usage scenarios:
68
+
69
+ ###Irrespective of arguments:
70
+ ```ruby
71
+ it "should be able to determine if a call was made on a fake" do
72
+ the_fake = fake
73
+ fake.hello("World")
74
+
75
+ fake.should have_received(:hello) #true
76
+ end
77
+ ```
78
+ ###With a specific set of arguments:
79
+ ```ruby
80
+ it "should be able to determine if a call was made on a fake" do
81
+ the_fake = fake
82
+ fake.hello("World")
83
+
84
+ fake.should have_received(:hello,"World") #true
85
+ fake.should have_received(:hello,"Other") #false
86
+ end
87
+ ```
88
+ Remember, that because it is just a matcher, to negate the matcher you can use the should_not qualifier to do the opposite:
89
+
90
+ ###Determine whether a call was not made with a specific set of arguments:
91
+ ```ruby
92
+ it "should be able to determine if a call was not made on a fake" do
93
+ the_fake = fake
94
+ fake.hello("World")
95
+
96
+ fake.should_not have_received(:hello,"Other") #true
97
+ end
98
+ ```
99
+
100
+ ##Determining that a call was made a certain number of times
101
+
102
+ ###Irrespective of arguments:
103
+ ```ruby
104
+ it "should be able to determine if a call was made on a fake" do
105
+ the_fake = fake
106
+ fake.hello("World")
107
+
108
+ fake.should have_received(:hello).once #true
109
+ end
110
+ ```
111
+
112
+ ###Caring about arguments:
113
+ ```ruby
114
+ it "should be able to determine if a call was made on a fake" do
115
+ the_fake = fake
116
+ fake.hello("World")
117
+
118
+ fake.should have_received(:hello,"World").once #true
119
+ fake.should have_received(:hello,"Earth").once #false
120
+ end
121
+ ```
122
+
123
+ Remember, that because it is just a matcher, to negate the matcher you can use the should_not qualifier to do the opposite:
124
+
125
+ ###Determine whether a call was not made a specific number of times with a specific set of arguments:
126
+ ```ruby
127
+ it "should be able to determine if a call was made on a fake" do
128
+ the_fake = fake
129
+ fake.hello("World")
130
+
131
+ fake.should_not have_received(:hello,"World").twice #true
132
+ fake.should_not have_received(:hello).twice #true
133
+ end
134
+ ```
135
+
136
+ After calling have_received, you can specify occurences using one of the following methods:
137
+
138
+ * once
139
+ * twice
140
+ * at_least_once
141
+ * at_least_twice
142
+ * at_most_once
143
+ * at_most_twice
144
+ * at_least(times)
145
+ * at_most(times)
146
+ * exactly(times)
147
+ * occurs(match_block) - Where match_block is a proc/lambda that matches the signature lambda{|number| bool}
148
+
149
+ An example of using the occurs method would be as follows:
150
+
151
+ ###Determine whether a call was made between a certain number of times
152
+ ```ruby
153
+ it "should be able to determine if a call was made on a fake" do
154
+ the_fake = fake
155
+ fake.hello("World")
156
+ fake.hello("Again")
157
+
158
+ fake.should have_received(,:hello).occurs(lamdba{|number| (1..3) === number}) #true
159
+ end
160
+ ```
161
+
162
+ ##Contributing
163
+
164
+ Feel free to fork this codebase and submit any pull requests you think would be useful. When you submit a pull request, make sure to include an accompanying test for the feature.
165
+
166
+
167
+ [Develop With Passion®](http://www.developwithpassion.com)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib",__FILE__)
3
+ require "fakes_rspec/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "fakes-rspec"
7
+ s.version = Fakes::RSpec::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Develop With Passion®"]
10
+ s.email = ["open_source@developwithpassion.com"]
11
+ s.homepage = "http://www.developwithpassion.com"
12
+ s.summary = %q{Utility functions for develowithpassion_fakes when working with rSpec}
13
+ s.description = %q{Faking library that allows inspection of received calls after they have been made. Also supports tracking calls with multiple argument sets.}
14
+ s.rubyforge_project = "fakes-rspec"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_development_dependency "rake"
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "guard"
23
+ s.add_development_dependency "guard-rspec"
24
+ s.add_runtime_dependency "fakes"
25
+ s.add_runtime_dependency "rspec"
26
+ end
@@ -0,0 +1,16 @@
1
+ require 'fakes'
2
+ require 'rspec'
3
+ require 'singleton'
4
+
5
+ require 'fakes_rspec/block_criteria'
6
+ require 'fakes_rspec/matcher'
7
+ require 'fakes_rspec/nullo_specification'
8
+ require 'fakes_rspec/occurances'
9
+ require 'fakes_rspec/received_occurances_criteria'
10
+ require 'fakes_rspec/received_criteria'
11
+
12
+ RSpec.configure do |config|
13
+ config.after(:each) do
14
+ reset_fake_classes
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ module Fakes
2
+ module RSpec
3
+ class BlockCriteria
4
+ def initialize(condition_block)
5
+ @condition_block = condition_block
6
+ end
7
+ def is_satisfied_by(item)
8
+ return @condition_block.call(item)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,46 @@
1
+ module RSpec
2
+ def self.create_received_criteria_from(the_call)
3
+ return Fakes::RSpec::ReceivedCriteria.new(the_call)
4
+ end
5
+ def self.create_received_occurences_criteria_from(the_call,occurence)
6
+ return Fakes::RSpec::ReceivedOccurencesCriteria.new(create_received_criteria_from(the_call),the_call,occurence)
7
+ end
8
+
9
+ Matchers.define :have_received do|symbol,*args|
10
+ @occurence_spec = Fakes::RSpec::NulloSpecification.instance
11
+
12
+ chain :once do
13
+ @occurence_spec = Fakes::RSpec::Occurances.exact(1)
14
+ end
15
+ chain :twice do
16
+ @occurence_spec = Fakes::RSpec::Occurances.exact(2)
17
+ end
18
+ chain :at_least_once do
19
+ @occurence_spec = Fakes::RSpec::Occurances.at_least(1)
20
+ end
21
+ chain :at_least_twice do
22
+ @occurence_spec = Fakes::RSpec::Occurances.at_least(2)
23
+ end
24
+ chain :at_most_once do
25
+ @occurence_spec = Fakes::RSpec::Occurances.at_most(1)
26
+ end
27
+ chain :at_most_twice do
28
+ @occurence_spec = Fakes::RSpec::Occurances.at_most(2)
29
+ end
30
+ chain :at_least do|times|
31
+ @occurence_spec = Fakes::RSpec::Occurances.at_least(times)
32
+ end
33
+ chain :at_most do|times|
34
+ @occurence_spec = Fakes::RSpec::Occurances.at_most(times)
35
+ end
36
+ chain :exactly do|times|
37
+ @occurence_spec = Fakes::RSpec::Occurances.exact(times)
38
+ end
39
+ chain :occurs do|the_proc|
40
+ @occurence_spec = Fakes::RSpec::Occurances.from_block(the_proc)
41
+ end
42
+ match do|the_fake|
43
+ RSpec.create_received_occurences_criteria_from(the_fake.received(symbol),@occurence_spec).is_satisfied_by(*args)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ module Fakes
2
+ module RSpec
3
+ class NulloSpecification
4
+ include Singleton
5
+ def is_satisfied_by(item)
6
+ return true
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ module Fakes
2
+ module RSpec
3
+ class Occurances
4
+ class << self
5
+ def from_block(the_block)
6
+ return BlockCriteria.new(the_block)
7
+ end
8
+ def exact(times)
9
+ return from_block(lambda{|occurances| return occurances == times})
10
+ end
11
+ def at_least(times)
12
+ return from_block(lambda { |occurences| return occurences >= times})
13
+ end
14
+ def at_most(times)
15
+ return from_block(lambda { |occurences| return occurences <= times})
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module Fakes
2
+ module RSpec
3
+ class ReceivedCriteria
4
+ def initialize(the_call)
5
+ @the_call = the_call
6
+ end
7
+
8
+ def is_satisfied_by(*args)
9
+ return false if @the_call == nil
10
+ return args.count == 0 ? true : @the_call.called_with(*args) != nil
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Fakes
2
+ module RSpec
3
+ class ReceivedOccurencesCriteria
4
+ def initialize(received_criteria,the_call,occurence)
5
+ @received_criteria = received_criteria
6
+ @the_call = the_call
7
+ @occurence = occurence
8
+ end
9
+
10
+ def is_satisfied_by(*args)
11
+ return @received_criteria.is_satisfied_by(*args) &&
12
+ @occurence.is_satisfied_by((args.count == 0 ? @the_call.total_times_called : @the_call.called_with(*args).times_called))
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module Fakes
2
+ module RSpec
3
+ VERSION = "1.0.4"
4
+ end
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakes-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -115,6 +115,21 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - Guardfile
121
+ - LICENSE
122
+ - README.md
123
+ - Rakefile
124
+ - fakes-rspec.gemspec
125
+ - lib/fakes-rspec.rb
126
+ - lib/fakes_rspec/block_criteria.rb
127
+ - lib/fakes_rspec/matcher.rb
128
+ - lib/fakes_rspec/nullo_specification.rb
129
+ - lib/fakes_rspec/occurances.rb
130
+ - lib/fakes_rspec/received_criteria.rb
131
+ - lib/fakes_rspec/received_occurances_criteria.rb
132
+ - lib/fakes_rspec/version.rb
118
133
  - spec/spec_helper.rb
119
134
  - spec/specs/block_criteria_spec.rb
120
135
  - spec/specs/nullo_specification_spec.rb
@@ -136,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
151
  version: '0'
137
152
  segments:
138
153
  - 0
139
- hash: -2011778260648523438
154
+ hash: -3560833146225028214
140
155
  required_rubygems_version: !ruby/object:Gem::Requirement
141
156
  none: false
142
157
  requirements:
@@ -145,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
160
  version: '0'
146
161
  segments:
147
162
  - 0
148
- hash: -2011778260648523438
163
+ hash: -3560833146225028214
149
164
  requirements: []
150
165
  rubyforge_project: fakes-rspec
151
166
  rubygems_version: 1.8.25