簡體   English   中英

使用Shoulda匹配器的rSpec測試Rails

[英]rSpec Testing Rails using Shoulda matchers

我已經開始在我的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)過山車驗證應該要求設置速度失敗/錯誤:它{should validate_presence_of(:spe​​ed)}當速度設置為nil時,預期錯誤包括“不能為空”,沒有錯誤#。/ spec / model /coaster_spec.rb:75:在'塊(3級)中'

2)過山車驗證應該要求設置高度失敗/錯誤:它{should validate_presence_of(:height)}當高度設置為nil時,預期錯誤包括“不能為空”,沒有錯誤#。/ spec / model /coaster_spec.rb:76:在'塊(3級)中'

類似問題:

我有這個測試:

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.should eq('Alton Towers'中的'Nemesis')NameError:未定義的局部變量或方法name_and_park' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_6:0x007f84f4161798> # ./spec/models/coaster_spec.rb:111:in block(3 levels)in'

它說name_and_park不能被調用,但是肯定應該在主題行中制作的Coaster實例上調用該方法? 沒有?

它是在“subject”上運行的,它可以通過subject方法顯式定義,也可以通過傳入一個類作為describe參數來隱式定義,在這種情況下,該類的實例被實例化並成為測試的主題。 請參閱https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/subject/explicit-subjecthttps://www.relishapp.com/rspec/rspec-core/v/2 -0 /文檔/受試者/隱式主體

至於更新問題的答案,在模型驗證中:speed:length ,你有allow_nil: true ,這就是為什么這兩個測試都失敗了。 validates_presence_of定義的一部分是nil不是可設置的值。

至於你的最新問題,我想你可能會對隱含主題的使用感到困惑。 如果should name_and_park使用它,它確實會默認為subject是什么,但是如果你自己包含一個主題,就像你在這種情況下使用name_and_park ,它不會將它視為默認主題的方法,它必須在當前命名空間中有一個定義。 在你的情況下,你需要說subject.name_and_park.should ...

在相關的旁邊,當您詢問特定問題或相關問題集並獲得答案時,最好使用StackOverflow。 由於各種原因,它不適用於正在進行的調試會話。 其中一個原因是跟蹤原始問題和答案的實質性,連續更新變得乏味。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM