pseudo 1.0.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 +7 -0
- data/lib/pseudo.rb +89 -0
- data/lib/pseudo/version.rb +5 -0
- data/test/pseudo_test.rb +139 -0
- data/test/test_helper.rb +5 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0389190263380a876dc7386958f563a0af0ac44c
|
4
|
+
data.tar.gz: 91d00d54c1862f6e58bf4f3469147250cf4aae7e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c10ee7146baee4b6b58d1ec784c9a27184008438bc3da01e765e34e5c7e05306c5f4b3c63ded737ca179fd5bc4f6e2030bc91363178e3d4ae97b9975214ea60f
|
7
|
+
data.tar.gz: 45b0ba775e68578c766d54284060f90fcc18d4db8fd88d5c6c868353dbb3a56ee57cff97bd07bd141d340250bd284c86a2e6ed266cc2cdb575d50c6ccdcf16f1
|
data/lib/pseudo.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Pseudo a very simple test double that supports stubbing and spies
|
4
|
+
class Pseudo
|
5
|
+
overridden_methods = %i(
|
6
|
+
object_id
|
7
|
+
respond_to_missing?
|
8
|
+
===
|
9
|
+
inspect
|
10
|
+
to_s
|
11
|
+
public_send
|
12
|
+
send
|
13
|
+
to_s
|
14
|
+
)
|
15
|
+
|
16
|
+
UNSTUBBED_ERROR_MESSAGE = 'unstubbed method %p, expected one of %p'.freeze
|
17
|
+
VERY_PRIVATE_METHOD_PREFIX = '__'.freeze
|
18
|
+
|
19
|
+
overridden_methods.each do |overridden_method|
|
20
|
+
define_method overridden_method do |*arguments, &block|
|
21
|
+
if @stubs.key? overridden_method
|
22
|
+
method_missing(overridden_method, *arguments, &block)
|
23
|
+
else
|
24
|
+
super(*arguments, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
instance_methods.each do |instance_method|
|
30
|
+
unless overridden_methods.include?(instance_method) ||
|
31
|
+
instance_method.to_s.start_with?(VERY_PRIVATE_METHOD_PREFIX)
|
32
|
+
undef_method instance_method
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@stubs = {}
|
38
|
+
@received = {}
|
39
|
+
end
|
40
|
+
|
41
|
+
def stub(name)
|
42
|
+
@stubs[name] = Stub.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def method_missing(symbol, *arguments, &block)
|
46
|
+
if @stubs.key?(symbol)
|
47
|
+
@received[symbol] = arguments
|
48
|
+
@stubs[symbol].act(&block)
|
49
|
+
else
|
50
|
+
fail NoMethodError, Kernel.format(
|
51
|
+
UNSTUBBED_ERROR_MESSAGE, symbol, @stubs.keys)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def received?(message)
|
56
|
+
@received.include?(message)
|
57
|
+
end
|
58
|
+
|
59
|
+
def received_with?(message, *arguments)
|
60
|
+
@received.fetch(message) { return false } == arguments
|
61
|
+
end
|
62
|
+
|
63
|
+
def respond_to?(symbol, include_private = false)
|
64
|
+
return true if @stubs.key?(symbol)
|
65
|
+
super
|
66
|
+
end
|
67
|
+
|
68
|
+
# A method stub
|
69
|
+
class Stub
|
70
|
+
def return(value)
|
71
|
+
@returns = value
|
72
|
+
end
|
73
|
+
|
74
|
+
def raise(*arguments)
|
75
|
+
@raises = arguments
|
76
|
+
end
|
77
|
+
|
78
|
+
def yield(value)
|
79
|
+
@yields = value
|
80
|
+
end
|
81
|
+
|
82
|
+
def act
|
83
|
+
return @returns if defined? @returns
|
84
|
+
Kernel.fail(*@raises) if defined? @raises
|
85
|
+
yield(@yields) if defined?(@yields) && block_given?
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/test/pseudo_test.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PseudoTest < Minitest::Test
|
4
|
+
parallelize_me!
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@double = Pseudo.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_that_it_has_a_version_number
|
11
|
+
refute_nil Pseudo::VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_stubs_respond_to_stubbed_methods
|
15
|
+
@double.stub(:stubbed_method)
|
16
|
+
|
17
|
+
assert_respond_to @double, :stubbed_method
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_stubs_return_nil_by_default
|
21
|
+
@double.stub(:default_stub)
|
22
|
+
|
23
|
+
assert_nil @double.default_stub
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_stubs_are_local_to_double
|
27
|
+
@double.stub(:old_stub)
|
28
|
+
new_double = Pseudo.new
|
29
|
+
|
30
|
+
refute_respond_to new_double, :old_stub
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_stubs_return_values
|
34
|
+
@double.stub(:stub_with_return).return(123)
|
35
|
+
|
36
|
+
assert_equal 123, @double.stub_with_return
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_stubs_raise_exceptions
|
40
|
+
@double.stub(:stub_with_raise).raise(ArgumentError, 'bad argument')
|
41
|
+
|
42
|
+
exception = assert_raises(ArgumentError) { @double.stub_with_raise }
|
43
|
+
assert_equal 'bad argument', exception.message
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_stubs_yield
|
47
|
+
@double.stub(:stub_with_yield).yield(456)
|
48
|
+
|
49
|
+
yielded = nil
|
50
|
+
@double.stub_with_yield { |value| yielded = value }
|
51
|
+
|
52
|
+
assert_equal 456, yielded
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_mocks_record_received
|
56
|
+
@double.stub(:record_it)
|
57
|
+
@double.stub(:never_called)
|
58
|
+
|
59
|
+
@double.record_it
|
60
|
+
|
61
|
+
assert_equal true, @double.received?(:record_it)
|
62
|
+
assert_equal false, @double.received?(:never_called)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_doubles_record_received_with_arguments
|
66
|
+
@double.stub(:record_it)
|
67
|
+
|
68
|
+
@double.record_it(:argument)
|
69
|
+
|
70
|
+
assert_equal true, @double.received_with?(:record_it, :argument)
|
71
|
+
assert_equal false, @double.received_with?(:record_it, :joke)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_keeps_double_underscored_method_definitions
|
75
|
+
assert_respond_to @double, :__send__
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_stubbing_object_id
|
79
|
+
@double.stub(:object_id).return('received object_id')
|
80
|
+
|
81
|
+
assert_equal 'received object_id', @double.object_id
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_stubbing_respond_to_missing
|
85
|
+
@double.stub(:respond_to_missing?).return('received respond_to_missing?')
|
86
|
+
|
87
|
+
assert_equal 'received respond_to_missing?', @double.respond_to_missing?
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_stubbing_case_equality
|
91
|
+
@double.stub(:===).return('received ===')
|
92
|
+
|
93
|
+
assert_equal 'received ===', @double.===
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_stubbing_inspect
|
97
|
+
@double.stub(:inspect).return('received inspect')
|
98
|
+
|
99
|
+
assert_equal 'received inspect', @double.inspect
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_stubbing_to_s
|
103
|
+
@double.stub(:to_s).return('received to_s')
|
104
|
+
|
105
|
+
assert_equal 'received to_s', @double.to_s
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_stubbing_public_send
|
109
|
+
@double.stub(:public_send).return('received public_send')
|
110
|
+
|
111
|
+
assert_equal 'received public_send', @double.public_send
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_stubbing_send
|
115
|
+
@double.stub(:send).return('received send')
|
116
|
+
|
117
|
+
assert_equal 'received send', @double.send
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_send_returns_stubbed_return_value
|
121
|
+
@double.stub(:sendable).return(123)
|
122
|
+
|
123
|
+
assert_equal 123, @double.send(:sendable)
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_public_send_returns_stubbed_return_value
|
127
|
+
@double.stub(:sendable).return(123)
|
128
|
+
|
129
|
+
assert_equal 123, @double.send(:sendable)
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_raises_no_method_error_on_unstubbed_methods
|
133
|
+
@double.stub(:stubbed)
|
134
|
+
|
135
|
+
exception = assert_raises(NoMethodError) { @double.unstubbed }
|
136
|
+
assert_equal 'unstubbed method :unstubbed, expected one of [:stubbed]',
|
137
|
+
exception.message
|
138
|
+
end
|
139
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pseudo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nate Smith
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-07-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: codeclimate-test-reporter
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.6.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.6.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 5.9.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 5.9.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 11.2.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 11.2.2
|
69
|
+
description: Pseudo supports stubs and spy-style message expectations.
|
70
|
+
email:
|
71
|
+
- nwjsmith@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/pseudo.rb
|
77
|
+
- lib/pseudo/version.rb
|
78
|
+
- test/pseudo_test.rb
|
79
|
+
- test/test_helper.rb
|
80
|
+
homepage: https://github.com/nwjsmith/pseudo
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 2.0.0
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.6.4
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: A mocking library that doesn't support bad tests.
|
104
|
+
test_files:
|
105
|
+
- test/pseudo_test.rb
|
106
|
+
- test/test_helper.rb
|
107
|
+
has_rdoc:
|