0

私はレールの初心者で、「Rspec」、「shoulda」、および「factory girl」の宝石を使用して既存のレールアプリのテストを作成する必要があります。validates_presence_of: something のような非特定のテストを '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 に答える