rspec `its` syntax with dynamic conditions

Not sure if there's a way to do exactly what you're asking for since the "subject" within the block becomes the return value of User#name.

Instead, I've used the let method along with the following spec style to write this kind of test:

describe User do

  describe '#name' do
    let(:contact) { Factory(:contact, name: 'Bob') }
    let(:user) { Factory(:user, contact: contact) }

    subject { user.name }

    it { should == 'Bob' }
  end

end

This of course makes some assumptions about what your contact represents (here it's an association or similar). You may also choose to stub the return value of User#contact instead of relying on FactoryGirl to set up a "real" association.

Regardless of the choices you make on those fronts, this strategy has worked well for me. I find it allows me to be more concise about what is under test, while preserving info (for other devs & future self) about where the expected return value is coming from.


You are almost answering yourself, use a let assignment before you set the subject. Then you can reference it everywhere:

context "as a user" do
  let(:user) { Factory(:user) }
  subject { user }
  its(:name) { should == user.contact.name }
end

I'm a context, subject, its lover too !

Tags:

Ruby

Scope

Rspec2