我使用Rails 3和RSpec 2.6.0.
不确定这是否可行,但这是我想做的事情:
describe UsersController do let(:user) {Fabricate :user } describe "GET /user/:id" do should_return_401_code_if_user_is_not_confirmed :get,:show,:id => user.id end describe "PUT /user/:id" do should_return_401_code_if_user_is_not_confirmed :put,:update,:id => user.id end end
我试着像这样实现宏:
module ControllerMacros def should_return_401_code_if_user_is_not_confirmed(verb,action,params = {}) it "returns a 401 code if the user is not an admin" do send verb,params response.code.should == "401" end end end
但是当运行这些规范时,我得到错误未定义的局部变量或方法’user’.我试图切换到在前一个块中定义的@user变量,但它也不起作用.我怀疑是因为我不是一个例子.
是否可以传递给let或在before块中定义的控制器宏参数?
谢谢!
解决方法
从阅读到rspec-users listserve上的
this thread,似乎答案是否定的.问题是你的let / before vars没有被初始化,直到它在宏体中阻塞,所以你不能将它们作为参数引用到宏调用.
我正在尝试在我正在处理的网站中做同样的事情.我要使用的解决方案是使用一个块来调用宏方法,该块将返回您想要的参数哈希值,然后使用宏体中的instance_eval来使用宏的范围来评估块.
#spec ... describe "GET /user/:id" do should_return_401_code_if_user_is_not_confirmed :get,:show { {:id => user.id} } end #macro ... def should_return_401_code_if_user_is_not_confirmed(verb,¶ms_block) it "returns a 401 code if the user is not an admin" do params = instance_eval ¶ms_block send verb,params ...