在Rspec寫測驗的程序中,如果遇到重復的必填引數{...},可以用let它來寫。這避免了為每個示例預先撰寫一堆引數準備。
但是,我不太了解 Better Specs 的范式。他的原始代碼是這樣的:
describe '#type_id' do
before { @resource = FactoryBot.create :device }
before { @type = Type.find @resource.type_id }
it 'sets the type_id field' do
expect(@resource.type_id).to eq(@type.id)
end
end
使用 let 后變成如下
describe '#type_id' do
let(:resource) { FactoryBot.create :device }
let(:type) { Type.find resource.type_id }
it 'sets the type_id field' do
expect(resource.type_id).to eq(type.id)
end
end
看起來呼叫 a 的方式resource幾乎相同,使用 let 有什么好處?的作用是FactoryBot.create:device什么?而且我看不到在哪里type被呼叫?
uj5u.com熱心網友回復:
不同之處在于 let 被延遲評估,然后為規范的其余部分進行記憶。
所以在第一個示例中,首先運行之前的塊并設定@resource 和@type 的值,然后運行規范。
在第二個例子中,規范運行,當它參考'resource'時,let塊運行并回傳一個值,然后當'type'被參考時,運行let塊。型別本身的 let 塊參考“資源”,因此它獲取從第一次參考資源時記憶的資源的值。
對于它的價值,我不同意讓“更好”。我和我的團隊發現,他們所做的只是讓規范變得更難理解,而且幾乎沒有什么好處,我們已經在所有專案中洗掉了對它們的所有使用。
事實上,我認為大多數“更好的規格”實際上都是糟糕的建議,所以如果你很難理解為什么某樣東西“更好”,那么你并不孤單:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460250.html
