我使用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