rspec `its` syntax with dynamic conditions rspec `its` syntax with dynamic conditions ruby ruby

rspec `its` syntax with dynamic conditions


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 !


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' }  endend

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 can just set an instance variable within the subject block:

context 'as a user' do  subject { @user = FactoryGirl.create(:user) }  its(:name) { should == @user.name }end