我使用Rspec和fixtures來測試Rails模型。使用Fixtures在rspec測試中刪除重複的代碼
一些測試用例有非常相似的代碼看起來像這樣
it 'creates request' do
u = users(:user_one)
o = documents(:document_one)
requests = Request.where(status: Request::PENDING, user: u, document: o)
expect { o.request_access(u) }.to change { requests.count }.by(1)
end
it 'does not create a request if user already has access' do
u = users(:user_one)
o = documents(:document_one)
Request.create status: Request::ACCEPTED, user: u, document: 0
requests = Request.where(status: Request::PENDING, user: u, document: o)
expect { o.request_access(u) }.not_to change { requests.count }
end
我怎麼能消除這裏代碼重複?有沒有辦法使用let
來解決問題?如果我有更多的測試用例,其中使用了其他固件,那麼Request.where(status: Request::PENDING, user: u, document: o)
是指其他對象呢?
偉大,謝謝。出於某種原因,我相信你不能在其他'let'塊中使用'let'塊。使用'subject'作爲':action'也不是更清楚嗎? –
@ S.S.J:不知道。從不喜歡'主題'。此外,它暗示了一些對象,而在這裏我們有一個行動。但無論你想要什麼都可以命名。 :) –
樣式不同,但除非您正在編寫共享方法,否則使用明確的「主題」通常是不鼓勵的。理想情況下,從閱讀測試中可以明顯看出這個問題。 – zetetic