Hello Jon,

Thanks for your reply.

I modified it as:

RSpec::Matchers.define :have_constant do |const|
    match do |owner|
      @actual = owner.const_defined?(const) && owner.const_get(const)
      @expected = @second
      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 with #{actual} but got 
#{@second}"
    end
  end

Now the error message is close, but not quiet correct.

Failures:

  1) FeatureService constants should have constant 
:TABLE_OF_PREVIOUS_INSPECTIONS 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 
3oelqiFW but got 3oelqiFW1
       Diff:
       @@ -1,2 +1,2 @@
       -:TABLE_OF_PREVIOUS_INSPECTIONS
       +"3oelqiFW"

I want it to be like:

Failures:

  1) FeatureService constants should have constant 
:TABLE_OF_PREVIOUS_INSPECTIONS 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 
3oelqiFW but got 3oelqiFW1
       Diff:
       @@ -1,2 +1,2 @@
       -"3oelqiFW1"
       +"3oelqiFW"

What needs to be tweaked ?


On Monday, May 13, 2019 at 2:39:27 PM UTC+5:30, Jon Rowe wrote:
>
> Hi Arup
>
> You need to define `expected` and `actual` to surface the variables you 
> wish to diff. In your case `expected` should be `@second` and `actual` 
> should be `owner.const_defined?(const) && owner.const_get(const)`.
>
> See the matcher protocol documentation for more information.
>
>
> http://rspec.info/documentation/3.8/rspec-expectations/RSpec/Matchers/MatcherProtocol.html#diffable%3F-instance_method
>
> Cheers
> Jon Rowe
> ---------------------------
> [email protected] <javascript:>
> 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/6bedd04b-f1ff-44ad-84b8-44ed3fa796b6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to