как протестировать метод моделей с rspec и factory

Я новичок в рельсах, и мне нужно написать тесты для существующих приложений рельсов с драгоценными камнями «Rspec», «shoulda» и «factory girl». Я могу протестировать неспецифические тесты, такие как validates_presence_of: что-то с сопоставителями 'sholda'. Но я хочу протестировать методы, которые в моделях. Я могу визуализировать то, что мне нужно сделать, но я не могу сочинять.

Это пример того, о чем я говорю:

.
.
.
context 'is editable if project is not started' do
  setup do
    @brief=Factory(:brief)
    @started_project=Factory(:project_started, :brief => @brief)
    @brief_have_no_project=Factory(:brief)
  end
  specify "with editable brief" do
    @brief.brand_info = 'bla bla bla' #change brand info, this is impossible
    #i can't compose this section :S
  end
  specify "with non-editable brief" do

  end
end

.
.
.

Я хочу протестировать краткое редактирование в этом коде. Как я могу проверить это?

Это краткий код модели:

class Brief < ActiveRecord::Base
  belongs_to :project
  validate :can_only_be_edited_if_project_is_not_started

  .
  .
  .

  def can_only_be_edited_if_project_is_not_started
    errors.add(:project_id, 'can_only_be_edited_if_project_is_not_started') if
      !project.nil? && !project.brief_can_be_edited?
  end

  .
  .
  .

end

Я буду очень рад, если смогу найти отправную точку. Спасибо за помощь. :)

Неудачи:

1) Бриф доступен для редактирования, если проект не запущен с редактируемым брифом.

Failure/Error: @brief.brand_info = 'bla bla bla'
 NoMethodError:
   undefined method `brand_info=' for nil:NilClass
 # ./spec/models/brief_spec.rb:34:in `block (3 levels) in <top (required)>'

при попытке присвоить такое значение @brief.brand_info = 'bla bla bla'


person user1609468    schedule 19.08.2012    source источник


Ответы (2)


Чтобы проверить, сохранено ли оно:

@brief.save.should be_true

Проверка сил сохранения. Если проверка не пройдена, сохранение не происходит, и в этом случае возвращается false.

person ronalchn    schedule 19.08.2012

Я сам нашел решение этой проблемы.

it "with editable brief (not started project)" do
  brief=Factory.build(:brief)
  Factory(:project, :brief => brief)
  brief.should have(0).error_on(:project_id)
end
it "with editable brief (nil project)" do
  brief=Factory.build(:brief)
  brief.brand_info="bla bla bla"
  brief.should have(0).error_on(:project_id)
end
it "with non-editable brief" do
  brief=Factory.build(:brief)
  Factory(:project_started, :brief => brief)
  brief.should have(1).error_on(:project_id)
end
person user1609468    schedule 19.08.2012