fixturama 0.2.0 → 0.3.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: ed87b651886697aaea8b0a79ddbf5b875372ca382926f3dc07d8f3bec2a4d07d
4
- data.tar.gz: 76248c5bb6b75d335c80387d11b6446cee23829bf1ca8f6fb319c12a1b5f0e52
3
+ metadata.gz: 206c66b417306ab1f47517bbbac4fd0bbd3a713fb03a9ab6e01686010c23c9cc
4
+ data.tar.gz: 1bc6e5c7f657a7807c724cc5d36cb033da83ee24fc13aa61c01dfcc1d489476e
5
5
  SHA512:
6
- metadata.gz: 20607f5c8bc2ed14ac8bef4bf207495946a02f4a39e2d6d77661b4fa154c01b3f4072e62aaf9083509369eb4b9fe01b2c9dfe1aa4e87b7bf2bb9a3b31b0a1827
7
- data.tar.gz: baf0b2716a960d8885dda3dde622009ebf8a1335912358898283b42b7beea04137e9d2ee1bcc58d305b8cdf14c21f3bdfa4442674a4dbb780aad61486b0e2682
6
+ metadata.gz: 155ac458d289214601ef8162bdc743d875855d094cd783fc79c67a5a0403ece59d4e3a9073245f915e793091be109f7f6f33840cab22c95aee320b88e796efae
7
+ data.tar.gz: b8d70001291a4b3f30c076c0ec11d57e5401f9527b384426ae41e9db8e91d025baf0db92bb1101dce63cb94975b781bf279ec11ea0bfc568c0cf7332ccdbe0cc
data/CHANGELOG.md CHANGED
@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
+ ## [0.3.0] - [2020-03-08]
9
+
10
+ ### Added
11
+
12
+ - Support for exception arguments (nepalez)
13
+
14
+ ```yaml
15
+ ---
16
+ - class: API
17
+ chain: get_product
18
+ arguments:
19
+ - 1
20
+ actions:
21
+ - raise: API::NotFoundError
22
+ arguments: # <--- that's that
23
+ - "Cannot find a product by id: 1"
24
+ ```
25
+
26
+ which would raise `API::NotFoundError.new("Cannot find a product by id: 1")`
27
+
8
28
  ## [0.2.0] - [2020-02-17]
9
29
 
10
30
  ### Added
@@ -229,3 +249,4 @@ This is a first public release with features extracted from production app.
229
249
  [0.0.7]: https://github.com/nepalez/fixturama/compare/v0.0.6...v0.0.7
230
250
  [0.1.0]: https://github.com/nepalez/fixturama/compare/v0.0.7...v0.1.0
231
251
  [0.2.0]: https://github.com/nepalez/fixturama/compare/v0.1.0...v0.2.0
252
+ [0.3.0]: https://github.com/nepalez/fixturama/compare/v0.2.0...v0.3.0
data/README.md CHANGED
@@ -183,6 +183,8 @@ For http requests:
183
183
  - return: true
184
184
  repeate: 1 # this is the default value
185
185
  - raise: ActiveRecord::RecordNotFound
186
+ arguments:
187
+ - "Profile with id: 1 not found" # for error message
186
188
 
187
189
  - const: NOTIFIER_TIMEOUT_SEC
188
190
  value: 10
@@ -15,16 +15,24 @@ class Fixturama::Changes::Chain
15
15
  def initialize(**options)
16
16
  @error = error_from options
17
17
  @repeat = repeat_from options
18
+ rescue StandardError => err
19
+ raise Fixturama::FixtureError.new("an exception class", options, err)
18
20
  end
19
21
 
20
22
  def error_from(options)
21
- case value = options[:raise]
22
- when NilClass, TrueClass, "true" then StandardError
23
- when Class then value < Exception ? value : raise("Not an exception")
23
+ klass = klass_from(options)
24
+ params = options[:arguments]
25
+ params.is_a?(Array) ? klass.new(*params) : klass
26
+ end
27
+
28
+ def klass_from(options)
29
+ klass = case value = options[:raise]
30
+ when NilClass, TrueClass, "true" then StandardError
31
+ when Class then value
24
32
  else Kernel.const_get(value)
25
33
  end
26
- rescue StandardError => err
27
- raise Fixturama::FixtureError.new("an exception class", options, err)
34
+
35
+ klass < Exception ? klass : raise("#{klass} is not an exception")
28
36
  end
29
37
 
30
38
  def repeat_from(options)
@@ -0,0 +1,3 @@
1
+ module Fixturama
2
+ VERSION = "0.3.0"
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixturama
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin (nepalez)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2020-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: factory_bot
@@ -72,43 +72,47 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '10'
75
+ version: '13.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '10'
82
+ version: '13.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec-its
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.0'
89
+ version: '1.3'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.0'
96
+ version: '1.3'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.49'
103
+ version: '0.80'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.49'
111
- description:
110
+ version: '0.80'
111
+ description: |
112
+ Use fixtures to extract verbosity from RSpec specifications:
113
+ - load data,
114
+ - stub classes, modules and constants,
115
+ - seed the database via FactoryBot.
112
116
  email: andrew.kozin@gmail.com
113
117
  executables: []
114
118
  extensions: []
@@ -116,16 +120,8 @@ extra_rdoc_files:
116
120
  - README.md
117
121
  - CHANGELOG.md
118
122
  files:
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".rubocop.yml"
122
- - ".travis.yml"
123
123
  - CHANGELOG.md
124
- - Gemfile
125
- - LICENSE.txt
126
124
  - README.md
127
- - Rakefile
128
- - fixturama.gemspec
129
125
  - lib/fixturama.rb
130
126
  - lib/fixturama/changes.rb
131
127
  - lib/fixturama/changes/base.rb
@@ -145,21 +141,25 @@ files:
145
141
  - lib/fixturama/loader/context.rb
146
142
  - lib/fixturama/loader/value.rb
147
143
  - lib/fixturama/rspec.rb
148
- - spec/fixturama/load_fixture/_spec.rb
149
- - spec/fixturama/load_fixture/data.json
150
- - spec/fixturama/load_fixture/data.yaml
151
- - spec/fixturama/load_fixture/data.yml
152
- - spec/fixturama/seed_fixture/_spec.rb
153
- - spec/fixturama/seed_fixture/seed.yml
154
- - spec/fixturama/stub_fixture/_spec.rb
155
- - spec/fixturama/stub_fixture/stub.yml
156
- - spec/spec_helper.rb
144
+ - lib/fixturama/version.rb
157
145
  homepage: https://github.com/nepalez/fixturama
158
146
  licenses:
159
147
  - MIT
160
- metadata: {}
148
+ metadata:
149
+ bug_tracker_uri: https://github.com/nepalez/fixturama/issues
150
+ changelog_uri: https://github.com/nepalez/fixturama/blob/master/CHANGELOG.md
151
+ documentation_uri: https://www.rubydocs.info/gems/fixturama
152
+ homepage_uri: https://github.com/nepalez/fixturama
153
+ source_code_uri: https://github.com/nepalez/fixturama
161
154
  post_install_message:
162
- rdoc_options: []
155
+ rdoc_options:
156
+ - "--title"
157
+ - Fixturama - fixtures on steroids
158
+ - "--main"
159
+ - README.md
160
+ - "--line-numbers"
161
+ - "--inline-source"
162
+ - "--quiet"
163
163
  require_paths:
164
164
  - lib
165
165
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -177,13 +177,4 @@ rubygems_version: 3.0.6
177
177
  signing_key:
178
178
  specification_version: 4
179
179
  summary: A set of helpers to prettify specs with fixtures
180
- test_files:
181
- - spec/fixturama/load_fixture/_spec.rb
182
- - spec/fixturama/load_fixture/data.json
183
- - spec/fixturama/load_fixture/data.yaml
184
- - spec/fixturama/load_fixture/data.yml
185
- - spec/fixturama/seed_fixture/_spec.rb
186
- - spec/fixturama/seed_fixture/seed.yml
187
- - spec/fixturama/stub_fixture/_spec.rb
188
- - spec/fixturama/stub_fixture/stub.yml
189
- - spec/spec_helper.rb
180
+ test_files: []
data/.gitignore DELETED
@@ -1,12 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.gem
11
- .rspec_status
12
- .idea/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --require spec_helper
2
- --color
data/.rubocop.yml DELETED
@@ -1,22 +0,0 @@
1
- ---
2
- AllCops:
3
- DisplayCopNames: true
4
- DisplayStyleGuide: true
5
- StyleGuideCopsOnly: true
6
- TargetRubyVersion: 2.3
7
-
8
- Layout/LineLength:
9
- AllowHeredoc: true
10
- AllowURI: true
11
- URISchemes:
12
- - http
13
- - https
14
-
15
- Style/ClassAndModuleChildren:
16
- Enabled: false
17
-
18
- Style/Documentation:
19
- Enabled: false
20
-
21
- Style/StringLiterals:
22
- EnforcedStyle: double_quotes
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- before_install:
6
- - gem install bundler --no-document
7
- - gem update --system
8
- script:
9
- - bundle exec rspec
10
- - bundle exec rubocop
11
- rvm:
12
- - 2.3.0
13
- - 2.7.0
14
- - ruby-head
15
- matrix:
16
- allow_failures:
17
- - rvm: ruby-head
data/Gemfile DELETED
@@ -1,9 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in sms_aero.gemspec
4
- gemspec
5
-
6
- group :development, :test do
7
- gem "pry", platform: :mri
8
- gem "pry-byebug", platform: :mri
9
- end
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2019 Andrew Kozin (aka nepalez)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task default: :spec
data/fixturama.gemspec DELETED
@@ -1,24 +0,0 @@
1
- Gem::Specification.new do |gem|
2
- gem.name = "fixturama"
3
- gem.version = "0.2.0"
4
- gem.author = "Andrew Kozin (nepalez)"
5
- gem.email = "andrew.kozin@gmail.com"
6
- gem.homepage = "https://github.com/nepalez/fixturama"
7
- gem.summary = "A set of helpers to prettify specs with fixtures"
8
- gem.license = "MIT"
9
-
10
- gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
11
- gem.test_files = gem.files.grep(/^spec/)
12
- gem.extra_rdoc_files = Dir["README.md", "LICENSE", "CHANGELOG.md"]
13
-
14
- gem.required_ruby_version = ">= 2.2"
15
-
16
- gem.add_runtime_dependency "factory_bot", "~> 4.0"
17
- gem.add_runtime_dependency "rspec", "~> 3.0"
18
- gem.add_runtime_dependency "hashie", "~> 3.0"
19
- gem.add_runtime_dependency "webmock", "~> 3.0"
20
-
21
- gem.add_development_dependency "rake", "~> 10"
22
- gem.add_development_dependency "rspec-its", "~> 1.0"
23
- gem.add_development_dependency "rubocop", "~> 0.49"
24
- end
@@ -1,53 +0,0 @@
1
- RSpec.describe "load_fixture" do
2
- let(:expected) { { "foo" => { "bar" => 42 } } }
3
-
4
- context "YAML" do
5
- subject { load_fixture("#{__dir__}/data.yaml", id: 42) }
6
-
7
- it { is_expected.to eq expected }
8
- end
9
-
10
- context "YML" do
11
- subject { load_fixture("#{__dir__}/data.yml", id: 42) }
12
-
13
- it { is_expected.to eq expected }
14
- end
15
-
16
- context "YAML with ruby object" do
17
- subject { load_fixture("#{__dir__}/data.yaml", id: foobar) }
18
-
19
- before { class Test::Foobar; end }
20
-
21
- let(:foobar) { Test::Foobar.new }
22
- let(:expected) { { "foo" => { "bar" => foobar } } }
23
-
24
- it { is_expected.to eq expected }
25
- end
26
-
27
- context "JSON" do
28
- subject { load_fixture("#{__dir__}/data.json", id: 42) }
29
-
30
- it { is_expected.to eq expected }
31
- end
32
-
33
- context "JSON with ruby object" do
34
- subject { load_fixture("#{__dir__}/data.json", id: foobar) }
35
-
36
- before { class Test::Foobar; end }
37
-
38
- let(:foobar) { Test::Foobar.new }
39
- let(:expected) { { "foo" => { "bar" => foobar } } }
40
-
41
- it { is_expected.to eq expected }
42
- end
43
-
44
- context "with RSpec argument matchers" do
45
- subject { load_fixture("#{__dir__}/data.yaml", id: kind_of(Numeric)) }
46
-
47
- it "loads the matcher", aggregate_failures: true do
48
- expect("foo" => { "bar" => 42 }).to include subject
49
- expect("foo" => { "bar" => 99 }).to include subject
50
- expect("foo" => { "bar" => :a }).not_to include subject
51
- end
52
- end
53
- end
@@ -1,5 +0,0 @@
1
- {
2
- "foo": {
3
- "bar": <%= id %>
4
- }
5
- }
@@ -1,3 +0,0 @@
1
- ---
2
- foo:
3
- bar: <%= id %>
@@ -1,3 +0,0 @@
1
- ---
2
- foo:
3
- bar: <%= id %>
@@ -1,37 +0,0 @@
1
- RSpec.describe "seed_fixture" do
2
- subject { seed_fixture "#{__dir__}/seed.yml" }
3
-
4
- before do
5
- FactoryBot.define do
6
- factory :foo, class: Hash do
7
- transient do
8
- bar { 0 }
9
- baz { 0 }
10
- qux { 0 }
11
- end
12
-
13
- trait :bar do
14
- bar { 99 }
15
- end
16
-
17
- trait :baz do
18
- baz { 77 }
19
- end
20
-
21
- skip_create
22
- initialize_with { { bar: bar, baz: baz, qux: qux } }
23
- end
24
- end
25
- end
26
-
27
- it "runs the factory", aggregate_failures: true do
28
- expect(FactoryBot).to receive(:create_list).with(:foo, 1, :baz, qux: 42)
29
-
30
- expect(FactoryBot).to receive(:create_list) do |*args, **opts|
31
- expect(args).to eq [:foo, 3, :bar]
32
- expect(opts).to be_empty
33
- end
34
-
35
- subject
36
- end
37
- end
@@ -1,11 +0,0 @@
1
- ---
2
- - type: foo
3
- traits:
4
- - baz
5
- params:
6
- qux: 42
7
-
8
- - type: foo
9
- count: 3
10
- traits:
11
- - bar
@@ -1,120 +0,0 @@
1
- RSpec.describe "stub_fixture" do
2
- subject { arguments.map { |argument| Payment.new.pay(argument) } }
3
-
4
- before do
5
- class Payment
6
- def pay(_)
7
- 5
8
- end
9
- end
10
- end
11
-
12
- context "without stubbing" do
13
- let(:arguments) { [0] }
14
-
15
- it { is_expected.to eq [5] }
16
- end
17
-
18
- context "when message chain stubbed" do
19
- before { stub_fixture "#{__dir__}/stub.yml" }
20
-
21
- context "with a :raise option" do
22
- let(:arguments) { [0] }
23
-
24
- it "raises an exception" do
25
- expect { subject }.to raise_error ArgumentError
26
- end
27
- end
28
-
29
- context "with a :return option" do
30
- let(:arguments) { [1] }
31
-
32
- it "returns stubbed value" do
33
- expect(subject).to eq [8]
34
- end
35
- end
36
-
37
- context "with several actions" do
38
- let(:arguments) { [2] * 4 }
39
-
40
- it "calls the consecutive actions and then repeates the last one" do
41
- expect(subject).to eq [4, 2, 0, 0]
42
- end
43
- end
44
-
45
- context "with multi-count actions" do
46
- let(:arguments) { [3] * 4 }
47
-
48
- it "repeats the action a specified number of times" do
49
- expect(subject).to eq [6, 6, 0, 0]
50
- end
51
- end
52
-
53
- context "with several arguments" do
54
- let(:arguments) { [2, 3, 2, 3, 2, 3] }
55
-
56
- it "counts actions for every stub in isolation from the others" do
57
- expect(subject).to eq [4, 6, 2, 6, 0, 0]
58
- end
59
- end
60
-
61
- context "with partially defined options" do
62
- subject { Payment.new.pay(10, overdraft: true, notiy: true) }
63
-
64
- it "uses the stub" do
65
- expect(subject).to eq(-5)
66
- end
67
- end
68
-
69
- context "when options differ" do
70
- subject { Payment.new.pay(10, overdraft: false) }
71
-
72
- it "uses universal stub" do
73
- expect(subject).to eq(-1)
74
- end
75
- end
76
-
77
- context "with unspecified argument" do
78
- let(:arguments) { [4] }
79
-
80
- it "uses universal stub" do
81
- expect(subject).to eq [-1]
82
- end
83
- end
84
- end
85
-
86
- context "when constant stubbed" do
87
- before do
88
- TIMEOUT = 20
89
- stub_fixture "#{__dir__}/stub.yml"
90
- end
91
-
92
- it "stubs the constant" do
93
- expect(TIMEOUT).to eq 10
94
- end
95
- end
96
-
97
- context "when http request stubbed" do
98
- before { stub_fixture "#{__dir__}/stub.yml" }
99
-
100
- it "stubs the request properly" do
101
- req = Net::HTTP::Get.new("/foo")
102
- res = Net::HTTP.start("www.example.com") { |http| http.request(req) }
103
-
104
- expect(res.code).to eq "200"
105
- expect(res.body).to eq "foo"
106
- expect(res["Content-Length"]).to eq "3"
107
- end
108
-
109
- def delete_request
110
- req = Net::HTTP::Delete.new("/foo")
111
- Net::HTTP.start("www.example.com") { |http| http.request(req) }
112
- end
113
-
114
- it "stubs repetitive requests properly" do
115
- expect(delete_request.code).to eq "200"
116
- expect(delete_request.code).to eq "404"
117
- expect(delete_request.code).to eq "404"
118
- end
119
- end
120
- end
@@ -1,73 +0,0 @@
1
- ---
2
- - class: Payment
3
- chain:
4
- - new
5
- - pay
6
- actions:
7
- - return: -1
8
-
9
- - class: Payment
10
- chain:
11
- - new
12
- - pay
13
- arguments:
14
- - 0
15
- actions:
16
- - raise: ArgumentError
17
-
18
- - class: Payment
19
- chain:
20
- - new
21
- - pay
22
- arguments:
23
- - 1
24
- actions:
25
- - return: 8
26
-
27
- - class: Payment
28
- chain:
29
- - new
30
- - pay
31
- arguments:
32
- - 2
33
- actions:
34
- - return: 4
35
- - return: 2
36
- - return: 0
37
-
38
- - object: Payment.itself
39
- chain:
40
- - new
41
- - pay
42
- arguments:
43
- - 3
44
- actions:
45
- - return: 6
46
- repeat: 2
47
- - return: 0
48
-
49
- - class: Payment
50
- chain:
51
- - new
52
- - pay
53
- arguments:
54
- - 10
55
- - :overdraft: true
56
- actions:
57
- - return: -5
58
-
59
- - const: TIMEOUT
60
- value: 10
61
-
62
- - method: get
63
- uri: www.example.com/foo
64
- responses:
65
- - body: foo
66
- headers:
67
- Content-Length: 3
68
-
69
- - method: delete
70
- uri: /example.com/foo/ # Regexp!
71
- responses:
72
- - status: 200
73
- - status: 404 # for any request except for the first one
data/spec/spec_helper.rb DELETED
@@ -1,26 +0,0 @@
1
- begin
2
- require "pry"
3
- rescue LoadError
4
- nil
5
- end
6
-
7
- require "bundler/setup"
8
- require "fixturama/rspec"
9
-
10
- RSpec.configure do |config|
11
- # Enable flags like --only-failures and --next-failure
12
- config.example_status_persistence_file_path = ".rspec_status"
13
-
14
- # Disable RSpec exposing methods globally on `Module` and `main`
15
- config.disable_monkey_patching!
16
-
17
- config.expect_with :rspec do |c|
18
- c.syntax = :expect
19
- end
20
-
21
- config.around do |example|
22
- module Test; end
23
- example.run
24
- Object.send(:remove_const, :Test)
25
- end
26
- end