Я хочу проверить включение модуля в класс. Я пытаюсь определить новый класс в RSpec:Определить класс в Rspec
describe Statusable do
let(:test_class) do
class ModelIncludingStatusable < ActiveRecord::Base
include Statusable
statuses published: "опубликовано", draft: "черновик"
end
end
describe '#statuses' do
it 'sets STATUSES for a model' do
test_class::STATUSES.should == ["опубликовано", "черновик"]
end
end
end
И я получаю ошибку:
TypeError:
[ActiveModel::Validations::InclusionValidator] is not a class/module
Это, вероятно, потому, что в Statusable
у меня есть:
validates_inclusion_of :status, :in => statuses,
:message => "{{value}} должен быть одним из: #{statuses.join ','}"
Но если я комментирую это, я получаю:
TypeError:
["опубликовано", "черновик"] is not a class/module
Возможно, новое определение класса - не самый лучший вариант, что мне делать тогда? И даже если это не так, как я могу определить класс в RSpec? И как я могу исправить эту ошибку?
Спасибо, это работает. Почему метод класса предпочтительнее? – leemour
@leemour, мое удовольствие. Две причины для метода класса: 1. имя константы должно быть статическим.В вопросе «STATUS» фактически находится под пространством имен «Foo» для чтения как «Statusable :: STATUS», но теперь это «FOO :: STATUS», который намеревается означать одно и то же. 2. Постоянное значение должно быть статическим, вы не можете ожидать, что значение константы изменится в соответствии с кодом. –
Хорошо, но я определял статус в статусе '# status ', когда он вызывался в классе, который включал' Statusable', как в моем коде выше. Плохое решение? – leemour