[英]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(:speed)}當速度設置為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-subject和https://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.