RSpec empty? method

Viewed 2030

Please tell me how to write a test for this method using Rspec

def to_s
    display_name.empty? ? legal_name : display_name
 end

I am new and just starting RSpec tests

UPD

My try:

describe "display name" do
    it "display name empty" do
      legal_name.to_s
      expect(display_name).to be_empty
    end
  end

Tried only one part check

I understand that it is incorrect, but I tried many options

1 Answers

legal_name and display_name are methods of an object, so you need to make an object to test. I don't know what class you're testing, so we'll call it SomeClass.

describe SomeClass do
  # Now when you reference `object` this block of code will run,
  # but only once per test.
  # See https://relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let
  let(:object) {
    # Or however you create the object.
    SomeClass.new
  }
end

You're testing the behavior of the to_s method when the object's display_name method is empty or not. So we have at least two "contexts".

  1. When display_name is empty.
  2. When display_name is not empty.
describe SomeClass do
  let(:object) {
    SomeClass.new
  }

  # We're testing its to_s method, not display_name.
  describe '#to_s' do
    # These are the conditions we're going to test.
    # They're just stubs for now.
    context 'when display_name is empty'
    context 'when display_name is not empty'
  end
end

Now that the scaffolding is in place, we can set up the objects in each context using a before hook which contains code to run before each test. I don't know how exactly to do that in your code, I'll just take a guess.

describe SomeClass
  let(:object) {
    SomeClass.new
  }

  describe '#to_s' do
    context 'when display_name is empty' do
      # This will run before each test in this context block
      # to make object.display_name empty.
      before do
        object.display_name = ''
        object.legal_name = 'something'
      end
    end

    context 'when display_name is not empty' do
      # This will run before each test in this context block
      # to make object.display_name not empty.
      before do
        object.display_name = 'something'
        object.legal_name = 'something else'
      end
    end
  end
end

Now in each context the object will be set up correctly.

Finally, add the tests. Call to_s and make sure it returns the expected value, either what's in display_name or what's in legal_name.

describe SomeClass
  let(:object) {
    SomeClass.new
  }

  describe '#to_s' do
    context 'when display_name is empty' do
      before do
        object.display_name = ''
        object.legal_name = 'legal'
      end

      it 'uses legal_name' do
        expect(object.to_s) to eq 'legal'
      end
    end

    context 'when display_name is not empty' do
      before do
        object.display_name = 'display'
        object.legal_name = 'legal'
      end

      it 'uses display_name' do
        expect(object.to_s) to eq 'display'
      end
    end
  end
end

It's a lot of scaffolding, but it makes it very clear what situations are being tested.

As a final note, consider another context...

    context 'when display_name is blank' do
      before do
        object.display_name = ' '
        object.legal_name = 'legal'
      end
    end

What should happen there? Look into blank?.

Related