I just added your code and run the test intentionally to see the failure
message. But there is no diff printed.
rspec ./spec/services/feature_service_spec.rb
.....F.
Failures:
1) FeatureService constants should have constant "3oelqiFW1" with value
"3oelqiFW1"
Failure/Error: it { is_expected.to
have_constant(:TABLE_OF_PREVIOUS_INSPECTIONS).with_value('3oelqiFW1') }
expected that TABLE_OF_PREVIOUS_INSPECTIONS would be defined with
3oelqiFW1 but got 3oelqiFW
# ./spec/services/feature_service_spec.rb:12:in `block (3 levels) in
<top (required)>'
# ./spec/rails_helper.rb:41:in `block (3 levels) in <top (required)>'
#
/Users/aruprakshit/.rvm/gems/ruby-2.3.3@DockingTestApp/gems/database_cleaner-1.6.1/lib/database_cleaner/generic/base.rb:16:in
`cleaning'
#
/Users/aruprakshit/.rvm/gems/ruby-2.3.3@DockingTestApp/gems/database_cleaner-1.6.1/lib/database_cleaner/base.rb:98:in
`cleaning'
#
/Users/aruprakshit/.rvm/gems/ruby-2.3.3@DockingTestApp/gems/database_cleaner-1.6.1/lib/database_cleaner/configuration.rb:86:in
`block (2 levels) in cleaning'
#
/Users/aruprakshit/.rvm/gems/ruby-2.3.3@DockingTestApp/gems/database_cleaner-1.6.1/lib/database_cleaner/configuration.rb:87:in
`cleaning'
# ./spec/rails_helper.rb:40:in `block (2 levels) in <top (required)>'
Finished in 0.47436 seconds (files took 10.93 seconds to load)
7 examples, 1 failure
On Tue, May 14, 2019 at 8:46 PM Jon Rowe <[email protected]> wrote:
> As I said, you need to define the methods, e.g not the instance variables,
> they are considered “private” and are not called what you expect in this
> case.
>
> This does what you want:
>
> RSpec::Matchers.define :have_constant do |const|
> match do |owner|
> @actual_value = owner.const_defined?(const) && owner.const_get(const)
> actual == expected
> end
>
> def actual
> @actual_value
> end
>
> def expected
> raise ArgumentError, "expected value not set" unless @expected_value
> @expected_value
> end
>
> chain :with_value do |second|
> @expected_value = second
> end
>
> diffable
>
> failure_message do
> "expected that #{const} would be defined with #{expected} but got
> #{actual}"
> end
> end
>
>
> Cheers
> Jon Rowe
> ---------------------------
> [email protected]
> jonrowe.co.uk
>
> On 13 May 2019 at 10:56, Arup Rakshit wrote:
>
> Hi,
>
> I am trying to write a custom matcher, but not able to show the diff and
> error message correctly. I need help with it.
>
> RSpec::Matchers.define :have_constant do |const|
> match do |owner|
> owner.const_defined?(const) && owner.const_get(const) == @second
> end
>
> chain :with_value do |second|
> @second = second
> end
>
> diffable
>
> failure_message do |actual|
> "expected that #{const} would be defined in #{actual} with #{@second}"
> end
> end
>
> And the spec is:
>
> describe "FeatureService" do
> describe 'constants' do
> subject { FeatureService }
>
> it { is_expected.to
> have_constant(:IMO_NUMBER_VALIDATION).with_value('6cjXBWdq') }
> it { is_expected.to have_constant(:JOB_TYPES).with_value('6cjXBWdq') }
> # ...
> end
> end
>
> The actual class is:
>
> class FeatureService
> JOB_TYPES = 'WN2HsoIm'.freeze
>
> #...
> end
>
> When I run the test the failure message is not quiet helpful. So how can I
> tweak the custom matcher so that it can be helpful when it writes to stdout
> than what I see currently.
>
> $ rspec ./spec/services/feature_service_spec.rb:8
> Run options: include
> {:locations=>{"./spec/services/feature_service_spec.rb"=>[8]}}
> F
>
> Failures:
>
> 1) FeatureService constants should have constant :JOB_TYPES with value
> "6cjXBWdq"
> Failure/Error: it { is_expected.to
> have_constant(:JOB_TYPES).with_value('6cjXBWdq') }
>
> expected that JOB_TYPES would be defined in FeatureService with
> 6cjXBWdq
> Diff:
> @@ -1,2 +1,2 @@
> -:JOB_TYPES
> +FeatureService
>
> # ./spec/services/feature_service_spec.rb:8:in `block (3 levels) in
> <top (required)>'
>
> --
> You received this message because you are subscribed to the Google Groups
> "rspec" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rspec/dejalu-217-545311dc-8609-4a6b-82f8-2a32a1e53f37%40jonrowe.co.uk
> <https://groups.google.com/d/msgid/rspec/dejalu-217-545311dc-8609-4a6b-82f8-2a32a1e53f37%40jonrowe.co.uk?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rspec/CAKxHnE3EkraKV%2B_DcB74edhLeRJfv8neuN7LVghfoy4aFjvzcA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.