In contrast to RSpec's included allow_value matcher, the attached matcher will also work on associations, which makes it ideal for testing assignable_values.
Usage example
describe Unit do
  describe '#building' do
    it 'should only allow buildings that a user has access to' do
      building = build(:building)
      other_building = build(:building)
      unauthorized_building = build(:building)
      power = Power.new(build(:user))
      Power.with_power(power) do
        expect(power).to receive(:buildings).at_least(1).time.and_return [building, other_building]
        expect(build(:unit)).to allow_association_values(building, other_building).for(:building)
        expect(build(:unit)).not_to allow_association_values(unauthorized_building, nil).for(:building)
      end
    end
  end
end
Alternatively you could test explicitly for the method that assignable_values generates:
...
      Power.with_power(power) do
        expect(power).to receive(:buildings).at_least(1).time.and_return [building, other_building]
        
        unit = build(:unit)
        expect(unit.assignable_buildings).to contain_exactly(building, other_building)
        expect(unit.assignable_buildings).not_to include(unauthorized_building, nil)
      end
...
See RSpec: Where to put custom matchers and other support code
Posted by Dominik Schöler to makandra dev (2013-09-04 09:26)