我已經完成哈特爾的Rails的教程和混亂的一個領域仍然居於主導:我什麼時候使用@variable
,當我應該使用:variable
,當只是variable
正確的嗎?何時使用at符號(@),冒號(:)和rspec/rails中的變量名?
下面是一些示例代碼,我從tutorial了:
describe "micropost associations" do
before { @user.save }
let!(:older_micropost) do
FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
end
let!(:newer_micropost) do
FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
end
.
.
.
it "should destroy associated microposts" do
microposts = @user.microposts.dup
@user.destroy
microposts.should_not be_empty
microposts.each do |micropost|
Micropost.find_by_id(micropost.id).should be_nil
end
end
end
.
.
.
end
相比於:
describe Micropost do
let(:user) { FactoryGirl.create(:user) }
before { @micropost = user.microposts.build(content: "Lorem ipsum") }
以下是這(和其他代碼)提出了我一些更具體的問題:
- 是否
@user
需要@
在第一個片段,因爲它的詞典定義。他主題還是..?? - 我是否總是使用
:
來聲明新變量? (實際上我相當確定情況並非如此,但我不明白那裏是什麼,因此我不明白。) - 當我後面提到使用
:
創建的變量時,是否再次使用:
?例如,如果我要執行print(:older_micropost)
或print(older_micropost)
,是否有區別? (請參閱第二個片段中的let
聲明)。 - 難道他們作爲全部工作的
before
塊作爲外部的一個內一樣嗎?我發現有些代碼只能在before
塊內部/外部工作(例如older_micropost.destroy
)。
我已經尋找其他地方的答案,但我找不到@
,:
,而且沒有任何討論。
編輯:這裏的第三個代碼段,這段時間我自己。我評論什麼可行,什麼不可行:
describe "deleting a user following" do
let(:userid) { @user.id }
before { print(@user.id.inspect) # this works
@user.destroy } # this works
@user.destroy # this doesn't
print(@user.id.inspect) # this doesn't
subject { other_user }
its(:followed_users) { should_not include(userid) }
end
(很顯然,我不運行所有4行註釋代碼在一起,我跑了兩個內線塊之前或兩者外)
爲什麼這些語句只能在before塊之前工作?
這是偉大的,真的有幫助,謝謝!在關於'之前'塊的部分,你有什麼想法爲什麼我的第三個代碼片斷的代碼在'before'塊之外失敗了嗎?一個簡單的例子是「描述」這個工作「在{@ user.destroy}結束與'描述'之前做'這不工作'do @ user.destroy結束' – Lindsayts 2013-02-16 03:26:34
你的代碼需要進入一個示例塊'it'或'specify'),或者一個'before'(或'after')塊。這些塊之外的代碼將在「主要」上下文中運行;示例中的代碼在單獨的上下文中運行,並且可以訪問設置塊中定義的變量和方法。 – zetetic 2013-02-16 06:17:44