加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何编写一个RSpec控制器宏,它可以接受let或在

发布时间:2020-12-16 19:05:19 所属栏目:百科 来源:网络整理
导读:我使用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 "
我使用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
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读