shoulda-context 1.2.2 → 2.0.0.rc1

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.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +190 -0
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +27 -2
  6. data/Appraisals +15 -32
  7. data/CHANGELOG.md +27 -0
  8. data/Gemfile +4 -1
  9. data/Gemfile.lock +72 -0
  10. data/MIT-LICENSE +1 -1
  11. data/README.md +140 -29
  12. data/Rakefile +19 -14
  13. data/bin/install_gems_in_all_appraisals +16 -0
  14. data/bin/run_all_tests +16 -0
  15. data/bin/setup +190 -0
  16. data/bin/supported_ruby_versions +7 -0
  17. data/bin/update_gem_in_all_appraisals +17 -0
  18. data/bin/update_gems_in_all_appraisals +16 -0
  19. data/{bin → exe}/convert_to_should_syntax +0 -0
  20. data/gemfiles/rails_4_2.gemfile +10 -0
  21. data/gemfiles/rails_4_2.gemfile.lock +164 -0
  22. data/gemfiles/rails_5_0.gemfile +10 -0
  23. data/gemfiles/rails_5_0.gemfile.lock +170 -0
  24. data/gemfiles/rails_5_1.gemfile +10 -0
  25. data/gemfiles/rails_5_1.gemfile.lock +170 -0
  26. data/gemfiles/rails_5_2.gemfile +10 -0
  27. data/gemfiles/rails_5_2.gemfile.lock +178 -0
  28. data/lib/shoulda/context.rb +12 -16
  29. data/lib/shoulda/context/assertions.rb +16 -13
  30. data/lib/shoulda/context/configuration.rb +19 -0
  31. data/lib/shoulda/context/context.rb +22 -305
  32. data/lib/shoulda/context/dsl.rb +279 -0
  33. data/lib/shoulda/context/railtie.rb +14 -0
  34. data/lib/shoulda/context/test_framework_detection.rb +4 -5
  35. data/lib/shoulda/context/version.rb +1 -1
  36. data/lib/shoulda/context/world.rb +22 -0
  37. data/shoulda-context.gemspec +19 -17
  38. data/test/fake_rails_root/test/shoulda_macros/custom_macro.rb +1 -1
  39. data/test/fake_rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +1 -2
  40. data/test/fake_rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +1 -2
  41. data/test/shoulda/autoload_macro_test.rb +1 -1
  42. data/test/shoulda/context_test.rb +92 -53
  43. data/test/shoulda/convert_to_should_syntax_test.rb +5 -7
  44. data/test/shoulda/helpers_test.rb +24 -59
  45. data/test/shoulda/railtie_test.rb +43 -0
  46. data/test/shoulda/should_test.rb +163 -24
  47. data/test/shoulda/test_framework_detection_test.rb +64 -71
  48. data/test/support/current_bundle.rb +61 -0
  49. data/test/support/rails_application_with_shoulda_context.rb +46 -0
  50. data/test/support/snowglobe.rb +5 -0
  51. data/test/test_helper.rb +35 -11
  52. metadata +71 -60
  53. data/gemfiles/minitest_4_x.gemfile +0 -7
  54. data/gemfiles/minitest_4_x.gemfile.lock +0 -96
  55. data/gemfiles/minitest_5_x.gemfile +0 -7
  56. data/gemfiles/minitest_5_x.gemfile.lock +0 -102
  57. data/gemfiles/rails_3_0.gemfile +0 -8
  58. data/gemfiles/rails_3_0.gemfile.lock +0 -93
  59. data/gemfiles/rails_3_1.gemfile +0 -10
  60. data/gemfiles/rails_3_1.gemfile.lock +0 -114
  61. data/gemfiles/rails_3_2.gemfile +0 -10
  62. data/gemfiles/rails_3_2.gemfile.lock +0 -112
  63. data/gemfiles/rails_4_0.gemfile +0 -10
  64. data/gemfiles/rails_4_0.gemfile.lock +0 -107
  65. data/gemfiles/rails_4_1.gemfile +0 -10
  66. data/gemfiles/rails_4_1.gemfile.lock +0 -119
  67. data/gemfiles/test_unit.gemfile +0 -7
  68. data/gemfiles/test_unit.gemfile.lock +0 -95
  69. data/init.rb +0 -1
  70. data/rails/init.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8f5e8f0cc83d3b44bd9eddf2193085c1b9fea968
4
- data.tar.gz: 7c8a322dea7cfb60550eb4a199a01346f86bfaa3
2
+ SHA256:
3
+ metadata.gz: 51bde035855288943372f8d9fc71310416ae02ddacbab30f912e5abbce21ab5f
4
+ data.tar.gz: ce5ee8ece26119b829ab2851b3607ed1f62c00478115ede3e3a987dc86455e16
5
5
  SHA512:
6
- metadata.gz: b441e5a21877364af355eb9a431fbd05be5065cd3c646c3335d397b87a1eb857e71c11a7f9b6884896c18c4dceb83ffcdde80773ed71ae31575b3d2a12c643e2
7
- data.tar.gz: 5893017828229249e980f1f4c67c08a04ec3619942a8b9dd455727be8d71525a39927ea764a3f8b3ba3fa90069bc99c77d92694b978329a60c64277ce3036ca8
6
+ metadata.gz: ef854338d26cb4613673c019d38fd66411899e5ab983421ed3d0db45449ac527c982faa8910b831421fd1a1edfbfa6f1e8572bba6d191ba17809b6b8aef4a338
7
+ data.tar.gz: e2854aad28db7d53de92728d00df9b51395e142d3f74a41da75883e8febc2a2e062c48d84e96879b9bae88f49bbce9002fd29442da33068e7d44d8042eea2e75
data/.gitignore CHANGED
@@ -1,5 +1,4 @@
1
1
  .bundle
2
- Gemfile.lock
3
2
  vendor/ruby
4
3
  vendor/cache
5
4
  doc
data/.rubocop.yml ADDED
@@ -0,0 +1,190 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+ Exclude:
4
+ - '*.gemspec'
5
+ Layout/AlignParameters:
6
+ EnforcedStyle: with_fixed_indentation
7
+ Layout/ConditionPosition:
8
+ Enabled: false
9
+ Layout/DotPosition:
10
+ EnforcedStyle: trailing
11
+ Layout/MultilineMethodCallIndentation:
12
+ EnforcedStyle: indented
13
+ Lint/AmbiguousOperator:
14
+ Enabled: false
15
+ Lint/AmbiguousRegexpLiteral:
16
+ Enabled: false
17
+ Lint/AssignmentInCondition:
18
+ Enabled: false
19
+ Lint/DeprecatedClassMethods:
20
+ Enabled: false
21
+ Lint/ElseLayout:
22
+ Enabled: false
23
+ Lint/HandleExceptions:
24
+ Enabled: false
25
+ Lint/IndentHeredoc:
26
+ Enabled: false
27
+ Lint/LiteralInInterpolation:
28
+ Enabled: false
29
+ Lint/Loop:
30
+ Enabled: false
31
+ Lint/ParenthesesAsGroupedExpression:
32
+ Enabled: false
33
+ Lint/RequireParentheses:
34
+ Enabled: false
35
+ Lint/UnderscorePrefixedVariableName:
36
+ Enabled: false
37
+ Lint/Void:
38
+ Enabled: false
39
+ Metrics/BlockLength:
40
+ Enabled: false
41
+ Metrics/ClassLength:
42
+ Enabled: false
43
+ Metrics/LineLength:
44
+ IgnoredPatterns:
45
+ - "^[ ]*describe.+$"
46
+ - "^[ ]*context.+$"
47
+ - "^[ ]*shared_context.+$"
48
+ - "^[ ]*shared_examples_for.+$"
49
+ - "^[ ]*it.+$"
50
+ - "^[ ]*'.+?' => '.+?',?$"
51
+ - "^[ ]*\".+?\" => \".+?\",?$"
52
+ - "^[ ]*.+?: .+?$"
53
+ Metrics/MethodLength:
54
+ Max: 30
55
+ Naming/AccessorMethodName:
56
+ Enabled: false
57
+ Naming/AsciiIdentifiers:
58
+ Enabled: false
59
+ Naming/BinaryOperatorParameterName:
60
+ Enabled: false
61
+ Naming/MemoizedInstanceVariableName:
62
+ EnforcedStyleForLeadingUnderscores: required
63
+ Style/ClassVars:
64
+ Enabled: false
65
+ Style/ColonMethodCall:
66
+ Enabled: false
67
+ Naming/FileName:
68
+ Enabled: false
69
+ Rails:
70
+ Enabled: true
71
+ Rails/Delegate:
72
+ Enabled: false
73
+ Rails/HttpPositionalArguments:
74
+ Enabled: false
75
+ Style/Alias:
76
+ Enabled: false
77
+ Style/ArrayJoin:
78
+ Enabled: false
79
+ Style/AsciiComments:
80
+ Enabled: false
81
+ Style/Attr:
82
+ Enabled: false
83
+ Style/CaseEquality:
84
+ Enabled: false
85
+ Style/CharacterLiteral:
86
+ Enabled: false
87
+ Style/ClassAndModuleChildren:
88
+ Enabled: false
89
+ Style/CollectionMethods:
90
+ PreferredMethods:
91
+ find: detect
92
+ reduce: inject
93
+ collect: map
94
+ find_all: select
95
+ Style/CommentAnnotation:
96
+ Enabled: false
97
+ Style/Documentation:
98
+ Enabled: false
99
+ Style/DoubleNegation:
100
+ Enabled: false
101
+ Style/EachWithObject:
102
+ Enabled: false
103
+ Style/EmptyLiteral:
104
+ Enabled: false
105
+ Style/Encoding:
106
+ Enabled: false
107
+ Style/EvenOdd:
108
+ Enabled: false
109
+ Style/ExpandPathArguments:
110
+ Enabled: false
111
+ Style/FlipFlop:
112
+ Enabled: false
113
+ Style/FormatString:
114
+ Enabled: false
115
+ Style/FrozenStringLiteralComment:
116
+ Enabled: false
117
+ Style/GlobalVars:
118
+ Enabled: false
119
+ Style/GuardClause:
120
+ Enabled: false
121
+ Style/IfUnlessModifier:
122
+ Enabled: false
123
+ Style/IfWithSemicolon:
124
+ Enabled: false
125
+ Style/InlineComment:
126
+ Enabled: false
127
+ Style/Lambda:
128
+ Enabled: false
129
+ Style/LambdaCall:
130
+ Enabled: false
131
+ Style/LineEndConcatenation:
132
+ Enabled: false
133
+ Style/MethodCalledOnDoEndBlock:
134
+ Enabled: false
135
+ Style/ModuleFunction:
136
+ Enabled: false
137
+ Style/NegatedIf:
138
+ Enabled: false
139
+ Style/NegatedWhile:
140
+ Enabled: false
141
+ Style/Next:
142
+ Enabled: false
143
+ Style/NilComparison:
144
+ Enabled: false
145
+ Style/Not:
146
+ Enabled: false
147
+ Style/NumericLiterals:
148
+ Enabled: false
149
+ Style/NumericPredicate:
150
+ Enabled: false
151
+ Style/OneLineConditional:
152
+ Enabled: false
153
+ Style/PercentLiteralDelimiters:
154
+ Enabled: false
155
+ Style/PerlBackrefs:
156
+ Enabled: false
157
+ Style/PreferredHashMethods:
158
+ Enabled: false
159
+ Style/Proc:
160
+ Enabled: false
161
+ Style/RaiseArgs:
162
+ Enabled: false
163
+ Style/RegexpLiteral:
164
+ Enabled: false
165
+ Style/RescueStandardError:
166
+ Enabled: false
167
+ Style/SelfAssignment:
168
+ Enabled: false
169
+ Style/SignalException:
170
+ Enabled: false
171
+ Style/SingleLineBlockParams:
172
+ Enabled: false
173
+ Style/SingleLineMethods:
174
+ Enabled: false
175
+ Style/SpecialGlobalVars:
176
+ Enabled: false
177
+ Style/StringLiterals:
178
+ EnforcedStyle: double_quotes
179
+ Style/SymbolArray:
180
+ Enabled: false
181
+ Style/TrivialAccessors:
182
+ Enabled: false
183
+ Style/WhenThen:
184
+ Enabled: false
185
+ Style/WhileUntilModifier:
186
+ Enabled: false
187
+ Style/WordArray:
188
+ Enabled: false
189
+ Style/VariableInterpolation:
190
+ Enabled: false
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p247
1
+ 2.6.1
data/.travis.yml CHANGED
@@ -1,3 +1,28 @@
1
+ language: ruby
2
+ sudo: false
3
+ cache:
4
+ directories:
5
+ - vendor/bundle
6
+ script: "bundle exec rake"
7
+ # Source: <https://docs.travis-ci.com/user/languages/ruby/#bundler-20>
8
+ before_install:
9
+ - gem update --system '2.7.8' --no-document
10
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
11
+ - gem install bundler -v '< 2' --no-document
12
+ install: "bundle install --jobs=3 --retry=3 --path vendor/bundle"
13
+
1
14
  rvm:
2
- - 1.9.3
3
- - 2.0.0
15
+ - 2.6.1
16
+ - 2.5.1
17
+ - 2.4.4
18
+ - 2.3.7
19
+
20
+ env:
21
+ - TEST_FRAMEWORK=minitest
22
+ - TEST_FRAMEWORK=test_unit
23
+
24
+ gemfile:
25
+ - gemfiles/rails_4_2.gemfile
26
+ - gemfiles/rails_5_0.gemfile
27
+ - gemfiles/rails_5_1.gemfile
28
+ - gemfiles/rails_5_2.gemfile
data/Appraisals CHANGED
@@ -1,44 +1,27 @@
1
- appraise 'rails_3_0' do
2
- gem 'rails', '~> 3.0.0'
3
- gem 'sqlite3'
1
+ shared_dependencies = proc do
2
+ gem "sqlite3", "~> 1.3.6"
4
3
  end
5
4
 
6
- appraise 'rails_3_1' do
7
- gem 'rails', '~> 3.1.0'
8
- gem 'jquery-rails'
9
- gem 'sass-rails'
10
- gem 'sqlite3'
11
- end
5
+ appraise "rails_4_2" do
6
+ instance_eval(&shared_dependencies)
12
7
 
13
- appraise 'rails_3_2' do
14
- gem 'rails', '~> 3.2.0'
15
- gem 'jquery-rails'
16
- gem 'sass-rails'
17
- gem 'sqlite3'
8
+ gem "rails", "~> 4.2.0"
18
9
  end
19
10
 
20
- appraise 'rails_4_0' do
21
- gem 'rails', '~> 4.0.0'
22
- gem 'jquery-rails'
23
- gem 'sass-rails'
24
- gem 'sqlite3'
25
- end
11
+ appraise "rails_5_0" do
12
+ instance_eval(&shared_dependencies)
26
13
 
27
- appraise 'rails_4_1' do
28
- gem 'rails', github: 'rails/rails', branch: '4-1-stable'
29
- gem 'jquery-rails'
30
- gem 'sass-rails'
31
- gem 'sqlite3'
14
+ gem "rails", "~> 5.0.0"
32
15
  end
33
16
 
34
- appraise 'minitest_4_x' do
35
- gem 'minitest', '~> 4.0'
36
- end
17
+ appraise "rails_5_1" do
18
+ instance_eval(&shared_dependencies)
37
19
 
38
- appraise 'minitest_5_x' do
39
- gem 'minitest', '~> 5.0'
20
+ gem "rails", "~> 5.1.0"
40
21
  end
41
22
 
42
- appraise 'test_unit' do
43
- gem 'test-unit'
23
+ appraise "rails_5_2" do
24
+ instance_eval(&shared_dependencies)
25
+
26
+ gem "rails", "~> 5.2.0"
44
27
  end
data/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ ## 2.0.0 (unreleased)
4
+
5
+ ### Backward-incompatible changes
6
+
7
+ * Drop support for RSpec 2 matchers. Matchers passed to `should` must conform
8
+ to RSpec 3's API (`failure_message` and `failure_message_when_negated`).
9
+ * Drop support for Minitest 4.x (last updated in 2013).
10
+ * Drop support for end-of-lifed versions of Rails. Rails 4.2.x, 5.1.x, and 5.2.x
11
+ are the only versions supported now.
12
+ * Drop support for end-of-lifed versions of Ruby. Ruby 2.3.x, 2.4.x and 2.5.x
13
+ are the only versions supported now.
14
+
15
+ ### Bug fixes
16
+
17
+ * Fix how test names are generated so that when including the name of the
18
+ outermost test class, "Test" is not removed from the class name if it does not
19
+ fall at the end.
20
+ * Remove warning from Ruby about `context` not being used when using the gem
21
+ with warnings enabled.
22
+ * Fix macro autoloading code. Files intended to hold custom macros which are
23
+ located in either `test/shoulda_macros`, `vendor/gems/*/shoulda_macros`, or
24
+ `vendor/plugins/*/shoulda_macros` are now loaded and mixed into your test
25
+ framework's automatically.
26
+ * Restore compatibility with Shoulda Matchers, starting from 3.0.
27
+ * Fix some compatibility issues with Minitest 5.
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
- source 'http://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ gem "minitest"
6
+ gem "test-unit"
data/Gemfile.lock ADDED
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ shoulda-context (2.0.0.rc1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ appraisal (2.2.0)
10
+ bundler
11
+ rake
12
+ thor (>= 0.14.0)
13
+ ast (2.4.0)
14
+ byebug (10.0.2)
15
+ coderay (1.1.2)
16
+ jaro_winkler (1.5.2)
17
+ m (1.5.1)
18
+ method_source (>= 0.6.7)
19
+ rake (>= 0.9.2.2)
20
+ metaclass (0.0.4)
21
+ method_source (0.9.2)
22
+ minitest (5.11.3)
23
+ mocha (1.8.0)
24
+ metaclass (~> 0.0.1)
25
+ parallel (1.14.0)
26
+ parser (2.6.0.0)
27
+ ast (~> 2.4.0)
28
+ power_assert (1.1.3)
29
+ powerpack (0.1.2)
30
+ pry (0.12.2)
31
+ coderay (~> 1.1.0)
32
+ method_source (~> 0.9.0)
33
+ pry-byebug (3.6.0)
34
+ byebug (~> 10.0)
35
+ pry (~> 0.10)
36
+ psych (3.1.0)
37
+ rainbow (3.0.0)
38
+ rake (12.3.2)
39
+ rubocop (0.65.0)
40
+ jaro_winkler (~> 1.5.1)
41
+ parallel (~> 1.10)
42
+ parser (>= 2.5, != 2.5.1.1)
43
+ powerpack (~> 0.1)
44
+ psych (>= 3.1.0)
45
+ rainbow (>= 2.2.2, < 4.0)
46
+ ruby-progressbar (~> 1.7)
47
+ unicode-display_width (~> 1.4.0)
48
+ ruby-progressbar (1.10.0)
49
+ snowglobe (0.1.0)
50
+ test-unit (3.3.0)
51
+ power_assert
52
+ thor (0.20.3)
53
+ unicode-display_width (1.4.1)
54
+
55
+ PLATFORMS
56
+ ruby
57
+
58
+ DEPENDENCIES
59
+ appraisal
60
+ bundler (~> 1.0)
61
+ m
62
+ minitest
63
+ mocha
64
+ pry-byebug
65
+ rake
66
+ rubocop
67
+ shoulda-context!
68
+ snowglobe
69
+ test-unit
70
+
71
+ BUNDLED WITH
72
+ 1.17.3
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006-2013, Tammer Saleh, thoughtbot, inc.
1
+ Copyright (c) 2006-2013, Tammer Saleh and thoughtbot, inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person
4
4
  obtaining a copy of this software and associated documentation
data/README.md CHANGED
@@ -1,22 +1,34 @@
1
- # shoulda-context [![Gem Version](https://badge.fury.io/rb/shoulda-context.png)](http://badge.fury.io/rb/shoulda-context) [![Build Status](https://travis-ci.org/thoughtbot/shoulda-context.png?branch=master)](https://travis-ci.org/thoughtbot/shoulda-context)
1
+ # Shoulda Context [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-badge] [![Hound][hound-badge]][hound]
2
2
 
3
- [Official Documentation](http://rubydoc.info/github/thoughtbot/shoulda-context/master/frames)
3
+ [version-badge]: https://img.shields.io/gem/v/shoulda-context.svg
4
+ [rubygems]: https://rubygems.org/gems/shoulda-matchers
5
+ [travis-badge]: https://img.shields.io/travis/thoughtbot/shoulda-context/master.svg
6
+ [travis]: https://travis-ci.org/thoughtbot/shoulda-context
7
+ [downloads-badge]: https://img.shields.io/gem/dtv/shoulda-context.svg
8
+ [hound-badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
9
+ [hound]: https://houndci.com
4
10
 
5
- Shoulda's contexts make it easy to write understandable and maintainable tests for Test::Unit.
6
- It's fully compatible with your existing tests in Test::Unit, and requires no retooling to use.
11
+ Shoulda Context makes it easy to write understandable and maintainable tests
12
+ under Minitest and Test::Unit within Rails projects or plain Ruby projects. It's
13
+ fully compatible with your existing tests and requires no retooling to use.
7
14
 
8
- Refer to the [shoulda](https://github.com/thoughtbot/shoulda) gem if you want to know more
9
- about using shoulda with Rails or RSpec.
15
+ **[View the documentation for the latest version (1.2.2)][rubydocs] [View
16
+ the changelog][changelog]**
10
17
 
11
- ## Contexts
18
+ [changelog]: CHANGELOG.md
12
19
 
13
- Instead of writing Ruby methods with `lots_of_underscores`, shoulda-context adds
14
- context, setup, and should blocks...
20
+ ---
15
21
 
16
- ```ruby
17
- require "test/unit"
22
+ ## Usage
23
+
24
+ Instead of writing Ruby methods with `lots_of_underscores`, Shoulda Context lets
25
+ you name your tests and group them together using English.
26
+
27
+ At a minimum, the gem provides some convenience layers around core Minitest
28
+ functionality. For instance, this test case:
18
29
 
19
- class CalculatorTest < Test::Unit::TestCase
30
+ ```ruby
31
+ class CalculatorTest < Minitest::Test
20
32
  context "a calculator" do
21
33
  setup do
22
34
  @calculator = Calculator.new
@@ -33,35 +45,134 @@ class CalculatorTest < Test::Unit::TestCase
33
45
  end
34
46
  ```
35
47
 
36
- ... which combine to produce the following test methods:
48
+ is a prettier, but functionally equivalent, way of saying:
49
+
50
+ ```ruby
51
+ class CalculatorTest < Minitest::Test
52
+ def setup
53
+ @calculator = Calculator.new
54
+ end
55
+
56
+ define_method "test_: a calculator should add two numbers for the sum" do
57
+ assert_equal 4, @calculator.sum(2, 2)
58
+ end
59
+
60
+ define_method "test_: a calculator should multiply two numbers for the product" do
61
+ assert_equal 10, @calculator.product(2, 5)
62
+ end
63
+ end
64
+ ```
65
+
66
+ However, Shoulda Context also provides functionality apart from Minitest /
67
+ Test::Unit that allows you to shorten tests drastically by making use of
68
+ RSpec-compatible matchers. For instance, with [Shoulda
69
+ Matchers][shoulda-matchers] you can write such tests as:
70
+
71
+ ```ruby
72
+ class User < ActiveSupport::TestCase
73
+ context "validations" do
74
+ subject { FactoryBot.build(:user) }
75
+
76
+ should validate_presence_of(:first_name)
77
+ should validate_presence_of(:last_name)
78
+ should validate_uniqueness_of(:email)
79
+ should_not allow_value('weird').for(:email)
80
+ end
81
+ end
82
+ ```
83
+
84
+ [shoulda-matchers]: https://github.com/thoughtbot/shoulda-matchers
85
+
86
+ ## API
87
+
88
+ ### DSL
89
+
90
+ The primary method in Shoulda Context's API is `context`, which declares a group
91
+ of a tests.
92
+
93
+ These methods are available inside of a `context`:
94
+
95
+ * `setup` — a DSL-y alternative to defining a `setup` method
96
+ * `teardown` — a DSL-y alternative to defining a `teardown` method
97
+ * `should` — There are two forms:
98
+ 1. when passed a name + block, creates a test equivalent to defining a
99
+ `test_` method
100
+ 2. when passed a matcher, creates a test that will run the matcher, asserting
101
+ that it passes
102
+ * `should_not` — like the matcher version of `should`, but creates a test that
103
+ asserts that the matcher fails
104
+ * `should_eventually` — allows you to temporarily skip tests
105
+ * `context` — creates a subcontext
106
+
107
+ These methods are available within a test case class, but outside of a
108
+ `context`:
109
+
110
+ * `should` — same as above
111
+ * `should_not` — same as above
112
+ * `should_eventually` — same as above
113
+ * `described_type` — returns the class being tested, as determined by the class
114
+ name of the outermost class
115
+ * `subject` — lets you define an object that is the primary focus of the tests
116
+ within a context; this is most useful when using a matcher as the matcher will
117
+ make use of this as _its_ subject
37
118
 
38
- "test: a calculator should add two numbers for the sum."
39
- "test: a calculator should multiply two numbers for the product."
119
+ And these methods are available inside of a test (whether defined via a method
120
+ or via `should`):
40
121
 
41
- When running a single test method via (example from a Rails context):
122
+ * `subject` an instance of the class under test, which is derived
123
+ automatically from the name of the test case class but is overridable via the
124
+ class method version of `subject` above
42
125
 
43
- ruby -I"lib:test" path_to_test_file -n name_of_the_test_method
126
+ [rubydocs]: http://rubydoc.info/github/thoughtbot/shoulda-context/master/frames
44
127
 
45
- you should include a trailing space(!), e.g.,
128
+ ### Assertions
46
129
 
47
- ruby -I"lib:test" path_to_test_file -n "test: a calculator should add two numbers for the sum. "
130
+ In addition to the main API, the gem also provides some extra assertions that
131
+ may be of use:
48
132
 
133
+ * `assert_same_elements` — compares two arrays for equality, but ignoring
134
+ ordering
135
+ * `assert_contains` — asserts that an array has an item
136
+ * `assert_does_not_contain` — the opposite of `assert_contains`
137
+ * `assert_accepts` — what `should` uses internally; asserts that a matcher
138
+ object matches against a value
139
+ * `assert_reject` — what `should_not` uses internally; asserts that a matcher
140
+ object does not match against a value
49
141
 
50
- ## Assertions
142
+ ## Note on running tests
51
143
 
52
- It also has two additional Test::Unit assertions for working with Ruby's Array:
144
+ Normally, you will run a single test like this:
53
145
 
54
- assert_same_elements([:a, :b, :c], [:c, :a, :b])
55
- assert_contains(['a', '1'], /\d/)
56
- assert_contains(['a', '1'], 'a')
146
+ ruby -I lib -I test path_to_test.rb -n name_of_test_method
147
+
148
+ When using Shoulda Context, however, you'll need to put a space after the test
149
+ name:
150
+
151
+ ruby -I lib -I test path_to_test.rb -n "test_: a calculator should add two numbers for the sum. "
152
+
153
+ If this is too cumbersome, consider using the [m] gem to run tests instead:
154
+
155
+ m path_to_test.rb:39
156
+
157
+ [m]: https://github.com/qrush/m
158
+
159
+ ## Compatibility
160
+
161
+ Shoulda Context is tested and supported against Rails 5.x, Rails 4.2, Minitest
162
+ 5, Test::Unit 3, and Ruby 2.3+.
57
163
 
58
164
  ## Credits
59
165
 
60
- Shoulda is maintained and funded by [thoughtbot](http://thoughtbot.com/community).
61
- shoulda-context is maintained by [Travis Jeffery](https://github.com/travisjeffery).
62
- Thank you to all the [contributors](https://github.com/thoughtbot/shoulda-context/contributors).
166
+ Shoulda Context is maintained by [Travis Jeffery][travis-jeffery] and
167
+ thoughtbot. Thank you to all the [contributors].
168
+
169
+ [travis-jeffery]: https://github.com/travisjeffery
170
+ [contributors]: https://github.com/thoughtbot/shoulda-context/contributors
63
171
 
64
172
  ## License
65
173
 
66
- Shoulda is Copyright © 2006-2016 thoughtbot, inc.
67
- It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
174
+ Shoulda Context is copyright © 2006-2019 [thoughtbot, inc][thoughtbot-website].
175
+ It is free software, and may be redistributed under the terms specified in the
176
+ [MIT-LICENSE](MIT-LICENSE) file.
177
+
178
+ [thoughtbot-website]: https://thoughtbot.com