ruby-on-rails – 如何编写一个RSpec控制器宏,它可以接受let或在before块中定义的参数?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何编写一个RSpec控制器宏,它可以接受let或在before块中定义的参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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,&params_block)
  it "returns a 401 code if the user is not an admin" do
    params = instance_eval &params_block
    send verb,params
...

猜你在找的Ruby相关文章