How to test class methods in RSPEC How to test class methods in RSPEC ruby ruby

How to test class methods in RSPEC


Apparently there is a described_class method.

https://www.relishapp.com/rspec/rspec-core/docs/metadata/described-class

I suppose it's cleaner than subject.class, since it doesn't introduce another . method call, which reduces readability.

Using either described_class or subject.class may be more DRY than mentioning the class explicitly in every example. But personally I think not getting the syntax highlighting that comes with mentioning the class name explicitly is kind of a bummer, and I think it reduces readability, despite it totally winning in the maintainability department.

A question arises regarding best practice:

Should you use described_class whenever possible inside and outside the .expect() method, or only within the expect() method?


There isn't a subject equivalent for calling a method, so using it is the way to go here. The issue I see with your code as presented is that it doesn't actually explain what you are testing for. I would write something more like:

describe Buy do  describe '.get_days' do    it 'should detect hyphenated weeknights' do      Buy.get_days('Includes a 1-weeknight stay for up to 4 people').should == 1    end    it 'should detect hyphenated nights' do      Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace').should == 1    end    it 'should detect first number' do      Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)').should == 4    end  endend

I'm making assumptions about what you're after here, but hopefully the idea is clear. This will also lead to much more helpful error output when a test fails. Hope this helps!


This might be an old question but you can always use subject.class to get by:

describe Buy do  describe '.get_days' do    it { expect(subject.class.get_days('Includes a 1-weeknight stay for up to 4 people')).to eq 1 }  endend