2013-07-20 92 views
0

終於開始工作,通過一本關於rspec的書,並在緩慢構建它之前對我的一個模型執行一些簡單的測試。rspec和第一次測試試驗

我的模型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, 

    default_scope :order => 'name ASC' 

    delegate :name, :city, :region, :country, to: :park, allow_nil: true, prefix: true 
    delegate :name, :url, to: :manufacturer, prefix: true 

    validates :name, :presence => true 

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


    *def name_and_park 
    * "#{name} at #{park.name}" 
    *end 

    *def slug 
    * name_and_park.parameterize 
    *end 
end 

我的第一個簡單的測試:

describe Coaster do 

    it 'is valid with a name' do 
    coaster = Coaster.new(
     name: 'Collin' 
    ) 
    expect(coaster).to be_valid 
    end 

end 

,結果運行測試時,我得到:

1) Coaster is valid with a name 
    Failure/Error: expect(coaster).to be_valid 
    NoMethodError: 
     undefined method `name' for nil:NilClass 
    # ./app/models/coaster.rb:65:in `name_and_park' 
    # ./app/models/coaster.rb:69:in `slug' 
    # ./spec/models/coaster_spec.rb:9:in `block (2 levels) in <top (required)>' 

如果我刪除模型中標有星號的線條,那麼測試通過,但那些線條呢? s沒有通過測試?

回答

3

正是它說的 - 你創建了一個沒有關聯公園的過山車,所以致電park.name失敗。

這意味着驗證還可以確保模型有一個slu slu。

+0

爲了從過山車上獲得公園,我只是做了coaster.park_name,因爲我在代表上設置了前綴爲true。我在猜測,根據你所說的,爲了正確編寫測試,我需要確保我在測試中創建的杯墊有一個公園,然後測試杯墊的名稱? – rctneil

+0

@ rctneil哦,我錯過了你會設置':prefix',對不起。但是,是的,因爲沒有公園,那條線會失敗。所以我猜想,slu is是模型驗證的一部分。 –