bogus 0.1.0 → 0.1.1
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 +1 -0
- data/Gemfile.lock +6 -1
- data/README.md +3 -0
- data/features/changelog.md +30 -22
- data/features/configuration/fake_ar_attributes.feature +3 -1
- data/features/configuration/search_modules.feature +5 -0
- data/features/contract_tests/contract_tests_mocks.feature +12 -1
- data/features/contract_tests/contract_tests_spies.feature +14 -2
- data/features/contract_tests/contract_tests_stubs.feature +13 -2
- data/features/contract_tests/return_value_contracts.feature +15 -4
- data/features/fakes/anonymous_doubles.feature +15 -1
- data/features/fakes/duck_types.feature +12 -2
- data/features/fakes/fake_objects.feature +11 -1
- data/features/fakes/global_fake_configuration.feature +4 -1
- data/features/readme.md +2 -2
- data/features/safe_stubbing/argument_matchers.feature +32 -2
- data/features/safe_stubbing/safe_mocking.feature +9 -2
- data/features/safe_stubbing/safe_stubbing.feature +11 -2
- data/features/safe_stubbing/spies.feature +52 -1
- data/features/step_definitions/rspec_steps.rb +1 -2
- data/features/support/env.rb +19 -0
- data/lib/bogus/active_record_accessors.rb +4 -4
- data/lib/bogus/adds_recording.rb +1 -0
- data/lib/bogus/any_args.rb +32 -3
- data/lib/bogus/class_methods.rb +7 -1
- data/lib/bogus/copies_classes.rb +5 -2
- data/lib/bogus/fake.rb +0 -2
- data/lib/bogus/have_received_matcher.rb +5 -0
- data/lib/bogus/interaction.rb +66 -35
- data/lib/bogus/interactions_repository.rb +1 -1
- data/lib/bogus/makes_substitute_methods.rb +3 -2
- data/lib/bogus/mocking_dsl.rb +8 -0
- data/lib/bogus/public_methods.rb +1 -1
- data/lib/bogus/rspec_extensions.rb +8 -1
- data/lib/bogus/same_class.rb +14 -0
- data/lib/bogus/shadow.rb +8 -12
- data/lib/bogus/verifies_stub_definition.rb +1 -5
- data/lib/bogus/version.rb +1 -1
- data/spec/bogus/adds_recording_spec.rb +8 -0
- data/spec/bogus/class_methods_spec.rb +8 -2
- data/spec/bogus/clean_ruby_spec.rb +15 -0
- data/spec/bogus/have_received_matcher_spec.rb +45 -27
- data/spec/bogus/instance_methods_spec.rb +1 -1
- data/spec/bogus/interaction_spec.rb +87 -83
- data/spec/bogus/interactions_repository_spec.rb +8 -11
- data/spec/bogus/shadow_spec.rb +4 -1
- metadata +81 -39
- checksums.yaml +0 -7
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bogus (0.1.
|
4
|
+
bogus (0.1.1)
|
5
5
|
dependor (>= 0.0.4)
|
6
6
|
|
7
7
|
GEM
|
@@ -45,8 +45,11 @@ GEM
|
|
45
45
|
dependor (0.0.5)
|
46
46
|
diff-lcs (1.1.3)
|
47
47
|
ffi (1.0.11)
|
48
|
+
ffi (1.0.11-java)
|
48
49
|
gherkin (2.11.0)
|
49
50
|
json (>= 1.4.6)
|
51
|
+
gherkin (2.11.0-java)
|
52
|
+
json (>= 1.4.6)
|
50
53
|
growl (1.0.3)
|
51
54
|
guard (1.1.1)
|
52
55
|
listen (>= 0.4.2)
|
@@ -60,6 +63,7 @@ GEM
|
|
60
63
|
guard (>= 1.1)
|
61
64
|
i18n (0.6.1)
|
62
65
|
json (1.7.3)
|
66
|
+
json (1.7.3-java)
|
63
67
|
libnotify (0.7.4)
|
64
68
|
ffi (~> 1.0.11)
|
65
69
|
listen (0.4.5)
|
@@ -97,6 +101,7 @@ GEM
|
|
97
101
|
tzinfo (0.3.37)
|
98
102
|
|
99
103
|
PLATFORMS
|
104
|
+
java
|
100
105
|
ruby
|
101
106
|
|
102
107
|
DEPENDENCIES
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@ Bogus aims to make your unit tests more reliable by ensuring that you don't stub
|
|
7
7
|
[](https://coveralls.io/r/psyho/bogus?branch=master)
|
8
8
|
[](http://badge.fury.io/rb/bogus)
|
9
9
|
[](https://gemnasium.com/psyho/bogus)
|
10
|
+
[](http://githalytics.com/psyho/bogus)
|
10
11
|
|
11
12
|
## Example
|
12
13
|
|
@@ -24,6 +25,8 @@ class PostAdder < Struct.new(:post_repository)
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
28
|
+
require 'bogus/rspec'
|
29
|
+
|
27
30
|
describe PostAdder do
|
28
31
|
fake(:post_repository)
|
29
32
|
|
data/features/changelog.md
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
-
## 0.
|
1
|
+
## 0.1.1
|
2
2
|
|
3
|
-
|
3
|
+
- Minor bugfixes to Ruby 2.0 support
|
4
|
+
- Support for Rubinius (head) and JRuby
|
5
|
+
- Overwrite described_class in on verify_contract
|
6
|
+
- Added with{} and any(Klass) argument matchers
|
7
|
+
- Added have_received(:name, args) syntax
|
4
8
|
|
5
|
-
|
6
|
-
- Safe spying, stubbing, mocking.
|
7
|
-
- Veryfying contracts defined by test doubles.
|
9
|
+
## 0.1.0
|
8
10
|
|
9
|
-
|
11
|
+
- Support for stubbing on frozen fakes
|
12
|
+
- Safe stubbing of constructors
|
13
|
+
- Fixed spying on anonymous fakes
|
14
|
+
- Automatic handling of ActiveRecord columns
|
15
|
+
- Support Ruby 2.0 keyword arguments
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
-
|
14
|
-
|
15
|
-
|
17
|
+
### Breaking changes:
|
18
|
+
|
19
|
+
- Fakes no longer return themselves from unstubbed method calls, because this was often a source of confusion. In the new version we return a Bogus::UndefinedReturnValue which contains the method name and arguments from where it was returned.
|
20
|
+
|
21
|
+
## 0.0.4
|
22
|
+
|
23
|
+
- Support mocking methods with optional parameters
|
16
24
|
|
17
25
|
## 0.0.3
|
18
26
|
|
@@ -23,18 +31,18 @@ Initial version.
|
|
23
31
|
- Replacing classes with fakes
|
24
32
|
- Extracting common interface out of multpile classes to create duck types
|
25
33
|
|
26
|
-
## 0.0.
|
27
|
-
|
28
|
-
- Support mocking methods with optional parameters
|
34
|
+
## 0.0.2
|
29
35
|
|
30
|
-
|
36
|
+
- Makes it possible to stub method calls on objects that utilize method missing.
|
37
|
+
- Removed the need to require both bogus and bogus/rspec.
|
38
|
+
- Implemented anonymous fakes.
|
39
|
+
- Fixed a bug in copying ActiveRecord classes.
|
40
|
+
- (internal) Replaced autoloads with require.
|
31
41
|
|
32
|
-
|
33
|
-
- Safe stubbing of constructors
|
34
|
-
- Fixed spying on anonymous fakes
|
35
|
-
- Automatic handling of ActiveRecord columns
|
36
|
-
- Support Ruby 2.0 keyword arguments
|
42
|
+
## 0.0.1
|
37
43
|
|
38
|
-
|
44
|
+
Initial version.
|
39
45
|
|
40
|
-
- Fakes
|
46
|
+
- Fakes.
|
47
|
+
- Safe spying, stubbing, mocking.
|
48
|
+
- Veryfying contracts defined by test doubles.
|
@@ -18,7 +18,7 @@ Feature: fake_ar_attributes
|
|
18
18
|
end
|
19
19
|
|
20
20
|
Scenario: Adding missing accessors to AR classes
|
21
|
-
Given a file named "
|
21
|
+
Given a file named "blog_post.rb" with:
|
22
22
|
"""ruby
|
23
23
|
require 'active_record'
|
24
24
|
require 'nulldb'
|
@@ -43,6 +43,8 @@ Feature: fake_ar_attributes
|
|
43
43
|
|
44
44
|
Then the following test should pass:
|
45
45
|
"""ruby
|
46
|
+
require_relative 'blog_post'
|
47
|
+
|
46
48
|
post = fake(:blog_post, name: "the name")
|
47
49
|
stub(post).tags { "foo, bar" }
|
48
50
|
|
@@ -9,7 +9,10 @@ Feature: search_modules
|
|
9
9
|
def foo
|
10
10
|
end
|
11
11
|
end
|
12
|
+
"""
|
12
13
|
|
14
|
+
Given a file named "baz.rb" with:
|
15
|
+
"""ruby
|
13
16
|
module Bar
|
14
17
|
class Baz
|
15
18
|
def baz
|
@@ -20,6 +23,8 @@ Feature: search_modules
|
|
20
23
|
|
21
24
|
Then spec file with following content should pass:
|
22
25
|
"""ruby
|
26
|
+
require_relative 'foo'
|
27
|
+
require_relative 'baz'
|
23
28
|
|
24
29
|
Bogus.configure do |c|
|
25
30
|
c.search_modules << Bar
|
@@ -3,7 +3,7 @@ Feature: Contract tests with mocks
|
|
3
3
|
Whenever you mock something, you specify a contract on the arguments/return value pair. Bogus can check automatically Whether this contract was satisfied.
|
4
4
|
|
5
5
|
Background:
|
6
|
-
Given a file named "
|
6
|
+
Given a file named "library.rb" with:
|
7
7
|
"""ruby
|
8
8
|
class Library
|
9
9
|
def initialize
|
@@ -22,7 +22,10 @@ Feature: Contract tests with mocks
|
|
22
22
|
@books << book
|
23
23
|
end
|
24
24
|
end
|
25
|
+
"""
|
25
26
|
|
27
|
+
Given a file named "student.rb" with:
|
28
|
+
"""ruby
|
26
29
|
class Student
|
27
30
|
def read(book, library = Library.new)
|
28
31
|
if library.has_book?(book)
|
@@ -31,8 +34,12 @@ Feature: Contract tests with mocks
|
|
31
34
|
end
|
32
35
|
end
|
33
36
|
"""
|
37
|
+
|
34
38
|
And a spec file named "student_spec.rb" with:
|
35
39
|
"""ruby
|
40
|
+
require_relative 'student'
|
41
|
+
require_relative 'library'
|
42
|
+
|
36
43
|
describe Student do
|
37
44
|
fake(:library)
|
38
45
|
|
@@ -58,6 +65,8 @@ Feature: Contract tests with mocks
|
|
58
65
|
Scenario: Fails when mocked methods are not called on real object
|
59
66
|
Then spec file with following content should fail:
|
60
67
|
"""ruby
|
68
|
+
require_relative 'library'
|
69
|
+
|
61
70
|
describe Library do
|
62
71
|
verify_contract(:library)
|
63
72
|
|
@@ -76,6 +85,8 @@ Feature: Contract tests with mocks
|
|
76
85
|
Scenario: Verifies that mocked methods are called
|
77
86
|
Then spec file with following content should pass:
|
78
87
|
"""ruby
|
88
|
+
require_relative 'library'
|
89
|
+
|
79
90
|
describe Library do
|
80
91
|
verify_contract(:library)
|
81
92
|
|
@@ -3,13 +3,16 @@ Feature: Contract tests with spies
|
|
3
3
|
Whenever you spy on method invocations, it creates a contract specifying that some method can be called with a particular set of arguments. It can be automatically verified by Bogus, whether the method was actually called with those arguments.
|
4
4
|
|
5
5
|
Background:
|
6
|
-
Given a file named "
|
6
|
+
Given a file named "library.rb" with:
|
7
7
|
"""ruby
|
8
8
|
class Library
|
9
9
|
def checkout(book)
|
10
10
|
end
|
11
11
|
end
|
12
|
+
"""
|
12
13
|
|
14
|
+
Given a file named "student.rb" with:
|
15
|
+
"""ruby
|
13
16
|
class Student
|
14
17
|
def read(book, library = Library.new)
|
15
18
|
library.checkout(book)
|
@@ -17,8 +20,12 @@ Feature: Contract tests with spies
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
"""
|
23
|
+
|
20
24
|
And a spec file named "student_spec.rb" with:
|
21
25
|
"""ruby
|
26
|
+
require_relative 'student'
|
27
|
+
require_relative 'library'
|
28
|
+
|
22
29
|
describe Student do
|
23
30
|
fake(:library)
|
24
31
|
|
@@ -35,6 +42,8 @@ Feature: Contract tests with spies
|
|
35
42
|
Scenario: Stubbing methods that exist on real object
|
36
43
|
Then spec file with following content should pass:
|
37
44
|
"""ruby
|
45
|
+
require_relative 'library'
|
46
|
+
|
38
47
|
describe Library do
|
39
48
|
verify_contract(:library)
|
40
49
|
|
@@ -51,15 +60,18 @@ Feature: Contract tests with spies
|
|
51
60
|
Scenario: Verifing that stubbed methods are tested
|
52
61
|
Then spec file with following content should fail:
|
53
62
|
"""ruby
|
63
|
+
require_relative 'library'
|
64
|
+
|
54
65
|
describe Library do
|
55
66
|
verify_contract(:library)
|
56
|
-
|
57
67
|
end
|
58
68
|
"""
|
59
69
|
|
60
70
|
Scenario: Verifying that methods are tested with right arguments
|
61
71
|
Then spec file with following content should fail:
|
62
72
|
"""ruby
|
73
|
+
require_relative 'library'
|
74
|
+
|
63
75
|
describe Library do
|
64
76
|
verify_contract(:library)
|
65
77
|
|
@@ -15,7 +15,7 @@ Feature: Contract tests with stubs
|
|
15
15
|
will also create a contract on the method input parameters.
|
16
16
|
|
17
17
|
Background:
|
18
|
-
Given a file named "
|
18
|
+
Given a file named "library.rb" with:
|
19
19
|
"""ruby
|
20
20
|
class Library
|
21
21
|
def initialize
|
@@ -34,7 +34,10 @@ Feature: Contract tests with stubs
|
|
34
34
|
@books << book
|
35
35
|
end
|
36
36
|
end
|
37
|
+
"""
|
37
38
|
|
39
|
+
Given a file named "student.rb" with:
|
40
|
+
"""ruby
|
38
41
|
class Student
|
39
42
|
def read(book, library = Library.new)
|
40
43
|
if library.has_book?(book)
|
@@ -43,8 +46,12 @@ Feature: Contract tests with stubs
|
|
43
46
|
end
|
44
47
|
end
|
45
48
|
"""
|
49
|
+
|
46
50
|
And a spec file named "student_spec.rb" with:
|
47
51
|
"""ruby
|
52
|
+
require_relative 'student'
|
53
|
+
require_relative 'library'
|
54
|
+
|
48
55
|
describe Student do
|
49
56
|
fake(:library)
|
50
57
|
|
@@ -71,6 +78,8 @@ Feature: Contract tests with stubs
|
|
71
78
|
Scenario: Fails when stubbed methods are not called on real object
|
72
79
|
Then spec file with following content should fail:
|
73
80
|
"""ruby
|
81
|
+
require_relative 'library'
|
82
|
+
|
74
83
|
describe Library do
|
75
84
|
verify_contract(:library)
|
76
85
|
|
@@ -89,10 +98,12 @@ Feature: Contract tests with stubs
|
|
89
98
|
Scenario: Verifies that stubbed methods are called
|
90
99
|
Then spec file with following content should pass:
|
91
100
|
"""ruby
|
101
|
+
require_relative 'library'
|
102
|
+
|
92
103
|
describe Library do
|
93
104
|
verify_contract(:library)
|
94
105
|
|
95
|
-
let(:library) {
|
106
|
+
let(:library) { described_class.new }
|
96
107
|
|
97
108
|
it "allows checking out books that are in the inventory" do
|
98
109
|
library.return("Moby Dick")
|
@@ -5,7 +5,7 @@ Feature: Return value contracts
|
|
5
5
|
If it's not, the behavior of contract verification is not defined.
|
6
6
|
|
7
7
|
Background:
|
8
|
-
Given a file named "
|
8
|
+
Given a file named "session_controller.rb" with:
|
9
9
|
"""ruby
|
10
10
|
class SessionController
|
11
11
|
def initialize(authentication_service)
|
@@ -19,10 +19,10 @@ Feature: Return value contracts
|
|
19
19
|
:render_error
|
20
20
|
end
|
21
21
|
end
|
22
|
+
"""
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
Given a file named "authentication_service.rb" with:
|
25
|
+
"""ruby
|
26
26
|
class AuthenticationService
|
27
27
|
def initialize(user_db)
|
28
28
|
@user_db = user_db
|
@@ -34,9 +34,16 @@ Feature: Return value contracts
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
class WrongPassword < StandardError
|
39
|
+
end
|
37
40
|
"""
|
41
|
+
|
38
42
|
And a spec file named "session_controller_spec.rb" with:
|
39
43
|
"""ruby
|
44
|
+
require_relative 'session_controller'
|
45
|
+
require_relative 'authentication_service'
|
46
|
+
|
40
47
|
describe SessionController do
|
41
48
|
fake(:authentication_service)
|
42
49
|
let(:controller) { SessionController.new(authentication_service) }
|
@@ -58,6 +65,8 @@ Feature: Return value contracts
|
|
58
65
|
Scenario: Bogus makes sure that all the return values recorded by stubbing are also present in tests of the real object
|
59
66
|
Then spec file with following content should fail:
|
60
67
|
"""ruby
|
68
|
+
require_relative 'authentication_service'
|
69
|
+
|
61
70
|
describe AuthenticationService do
|
62
71
|
verify_contract(:authentication_service)
|
63
72
|
|
@@ -73,6 +82,8 @@ Feature: Return value contracts
|
|
73
82
|
Scenario: Bogus does not fail the tests if all the recorded values have been also recorded on the real object
|
74
83
|
Then spec file with following content should pass:
|
75
84
|
"""ruby
|
85
|
+
require_relative 'authentication_service'
|
86
|
+
|
76
87
|
describe AuthenticationService do
|
77
88
|
verify_contract(:authentication_service)
|
78
89
|
|
@@ -18,7 +18,7 @@ Feature: Anonymous test doubles
|
|
18
18
|
stub(factory).make_validator{ proc{ false } }
|
19
19
|
|
20
20
|
Background:
|
21
|
-
Given a file named "
|
21
|
+
Given a file named "student.rb" with:
|
22
22
|
"""ruby
|
23
23
|
class Student
|
24
24
|
attr_reader :library_card
|
@@ -36,6 +36,8 @@ Feature: Anonymous test doubles
|
|
36
36
|
Scenario: Stubbing any method with any parameters
|
37
37
|
Then spec file with following content should pass:
|
38
38
|
"""ruby
|
39
|
+
require_relative 'student'
|
40
|
+
|
39
41
|
describe Student do
|
40
42
|
let(:library) { fake }
|
41
43
|
let(:jake) { Student.new("Jake") }
|
@@ -53,6 +55,8 @@ Feature: Anonymous test doubles
|
|
53
55
|
Scenario: Stubbing methods in initializer
|
54
56
|
Then spec file with following content should pass:
|
55
57
|
"""ruby
|
58
|
+
require_relative 'student'
|
59
|
+
|
56
60
|
describe Student do
|
57
61
|
let(:library) { fake(register_junior: "the card") }
|
58
62
|
let(:jake) { Student.new("Jake") }
|
@@ -77,6 +81,8 @@ Feature: Anonymous test doubles
|
|
77
81
|
Scenario: Mocking any method with any parameters
|
78
82
|
Then spec file with following content should pass:
|
79
83
|
"""ruby
|
84
|
+
require_relative 'student'
|
85
|
+
|
80
86
|
describe Student do
|
81
87
|
let(:library) { fake }
|
82
88
|
let(:jake) { Student.new("Jake") }
|
@@ -94,6 +100,8 @@ Feature: Anonymous test doubles
|
|
94
100
|
Scenario: Mocking any method with any parameters
|
95
101
|
Then spec file with following content should fail:
|
96
102
|
"""ruby
|
103
|
+
require_relative 'student'
|
104
|
+
|
97
105
|
describe Student do
|
98
106
|
it "allows stubbing any method with any parameters" do
|
99
107
|
library = fake
|
@@ -105,6 +113,8 @@ Feature: Anonymous test doubles
|
|
105
113
|
Scenario: Stubbing methods in initializer
|
106
114
|
Then spec file with following content should pass:
|
107
115
|
"""ruby
|
116
|
+
require_relative 'student'
|
117
|
+
|
108
118
|
describe Student do
|
109
119
|
let(:library) { fake(register_junior: "the card") }
|
110
120
|
let(:jake) { Student.new("Jake") }
|
@@ -120,6 +130,8 @@ Feature: Anonymous test doubles
|
|
120
130
|
Scenario: Spying on method calls
|
121
131
|
Then spec file with following content should pass:
|
122
132
|
"""ruby
|
133
|
+
require_relative 'student'
|
134
|
+
|
123
135
|
describe Student do
|
124
136
|
let(:library) { fake }
|
125
137
|
let(:jake) { Student.new("Jake") }
|
@@ -135,6 +147,8 @@ Feature: Anonymous test doubles
|
|
135
147
|
Scenario: Invoking arbitrary methods
|
136
148
|
Then spec file with following content should pass:
|
137
149
|
"""ruby
|
150
|
+
require_relative 'student'
|
151
|
+
|
138
152
|
describe Student do
|
139
153
|
let(:library) { fake }
|
140
154
|
|