4

Rails アプリでのテストを学び始めており、rSpec と Shoulda を使用しています。

私は動作する次のテストを持っています:

it { should respond_to(:park_name) }

しかし、私が理解していないのは、これが実行されているのは何ですか? これはモデル自体またはモデルのインスタンスで実行されていますか?それがモデルのインスタンスである場合、Factory Girl ファクトリを自動的に使用しますか?

ここで実際に何が起こっているかについての簡単な説明はありますか?

アップデート:

わかりました、だから私はこれを持っています:

  describe 'validations' do

    subject { FactoryGirl.build(:coaster) }

    it { should validate_presence_of(:name) }
    it { should validate_presence_of(:speed) }
    it { should validate_presence_of(:height) }

  end

しかし、テストは失敗しています。何か案は?

Coaster.rb:

class Coaster < ActiveRecord::Base

      extend FriendlyId
      friendly_id :slug, use: :slugged

      belongs_to :park
      belongs_to :manufacturer

      attr_accessible :name,
                      :height,
                      :speed,
                      :length,
                      :inversions,
                      :material,
                      :lat,
                      :lng,
                      :park_id,
                      :notes,
                      :manufacturer_id,
                      :style,
                      :covering,
                      :ride_style,
                      :model,
                      :layout,
                      :dates_ridden,
                      :times_ridden,
                      :order,
                      :on_ride_photo



      scope :by_name_asc, lambda {
        order("name ASC")
      }

      scope :made_from, lambda { |material|
        where("material = ?", material)
      }

      scope :wooden, lambda {
        made_from "wood"
      }

      scope :steel, lambda {
        made_from "steel"
      }



      delegate :name, :location_1, :location_2, :location_3, :location_4,
        to: :park,
        allow_nil: true,
        prefix: true

      delegate :name, :url,
        to: :manufacturer,
        prefix: true



      validates :name,
        :presence => true

      validates :height,
        allow_nil: true,
        numericality: {greater_than: 0}

      validates :speed,
        allow_nil: true,
        numericality: {greater_than: 0}

      validates :length,
        allow_nil: true,
        numericality: {greater_than: 0}

試験結果:

1) コースターの検証では、速度を設定する必要があります 失敗/エラー: it { should validate_presence_of(:speed) } /coaster_spec.rb:75:in `ブロック (3 レベル) in '

2) Coaster の検証では、高さを設定する必要があります 失敗/エラー: it { should validate_presence_of(:height) } /coaster_spec.rb:76:in `ブロック (3 レベル) in '

同様の質問:

私はこのテストを持っています:

describe 'methods' do

    subject { FactoryGirl.build(:coaster) }

    it "should return a formatted string of coaster name at park name" do
        name_and_park.should eq('Nemesis at Alton Towers')
    end

  end

Coaster.rb:

  def name_and_park
    [name, park.name].join (' at ')
  end

テスト実行時のエラー:

2) コースター メソッドは、公園名のコースター名の書式設定された文字列を返す必要がありますname_and_park' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_6:0x007f84f4161798> # ./spec/models/coaster_spec.rb:111:in

name_and_park を呼び出すことはできませんが、そのメソッドは、件名で作成されている Coaster のインスタンスで呼び出す必要がありますか? いいえ?

4

1 に答える 1

3

subjectこれは、メソッドを介して明示的に定義されるか、引数としてクラスを渡すことによって暗黙的に定義される「サブジェクト」で実行されdescribeます。この場合、そのクラスのインスタンスがインスタンス化され、テストのサブジェクトになります。https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/subject/explicit-subjectおよびhttps://www.relishapp.com/rspec/rspec-core/v/2を参照してください-0/docs/件名/暗黙の件名

更新の質問への回答については、 と のモデル検証で が:speedあり:lengthますallow_nil: true。これが、これら 2 つのテストが失敗する理由です。の定義の一部は、設定可能な値validates_presence_ofではないということです。nil

最近の質問ですが、暗黙の主語の使用について混乱していると思います。が単独で使用されている場合should、それは実際に が何であれデフォルトになりsubjectますが、この場合の のように自分でサブジェクトを含めるとname_and_park、それはデフォルトのサブジェクトのメソッドとして扱われず、定義が必要です。現在の名前空間内。あなたの場合、あなたは言う必要がありますsubject.name_and_park.should ...

関連して、StackOverflow は、特定の質問または関連する一連の質問をして回答が得られる場合に最適です。さまざまな理由から、進行中のデバッグ セッションを対象としていません。これらの理由の 1 つは、元の質問と回答のかなりの連続した更新を追跡するのが面倒になることです。

于 2013-08-08T20:43:27.040 に答える