rails attr_accessible rspec check

Когда я хочу проверить, является ли атрибут / недоступен с RSpec, я делаю это так

class Foo
  attr_accesible :something_else
end

describe Foo do
  it('author should not be accessible')    {lambda{described_class.new(:author=>true)}.should raise_error ActiveModel::MassAssignmentSecurity::Error}
  it('something_else should be accessible'){lambda{described_class.new(:something_else=>true)}.should_not raise_error ActiveModel::MassAssignmentSecurity::Error}
end

Есть ли лучший способ сделать это?

...Спасибо

1 ответ

Решение

Именно так проходят тесты доступности атрибутов в руководстве по Rails, что, на мой взгляд, довольно хорошо. Так что, в вашем случае, тестовый код может быть немного изменен, чтобы читать как:

describe Foo do
  describe "accessible attributes" do
    it "should not allow access to author" do
      expect do
        Foo.new(author: true)
      end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end

    it "should allow access to something_else" do
      expect do
        Foo.new(something_else: true)
      end.to_not raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end
  end
end

Если это не то, что вы искали, можете ли вы дать нам лучшее представление о том, какое решение вы ищете, когда спросите, есть ли "лучший путь"?

редактировать

Возможно, вас заинтересуют средства сравнения Shoulda ActiveModel, которые будут очищать код до одной строки за тест. Что-то вроде:

it { should_not allow_mass_assignment_of(:author) }
it { should allow_mass_assignment_of(:something_else) }
Другие вопросы по тегам