0

我是 Rails 的新手,我必须使用“Rspec”、“should”和“factory girl” gem 为现有的 rails 应用程序编写测试。我可以测试非特定测试,例如 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'

4

2 回答 2

0

要检查它是否已保存:

@brief.save.should be_true

保存强制验证。如果验证失败,保存不会发生,在这种情况下它返回 false。

于 2012-08-19T01:27:46.027 回答
0

我自己找到了解决这个问题的方法。

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
于 2012-08-19T21:22:50.467 回答