gpt4 book ai didi

ruby-on-rails - 如何编写一个 RSpec Controller 宏,它可以接受由 let 或在 before block 中定义的参数?

转载 作者:行者123 更新时间:2023-12-04 06:31:05 25 4
gpt4 key购买 nike

我使用 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, action, params
response.code.should == "401"
end
end
end

但是在运行这些规范时,我收到错误 undefined local variable or method 'user' .我试图切换到在 before 块中定义的 @user 变量,但它也不起作用。我怀疑这是因为我不在示例块中。

是否可以传递给由 let 或在 before 块中定义的 Controller 宏参数?

谢谢!

最佳答案

从通读 this thread在 rspec-users listserve 上,似乎答案是否定的。问题是你的 let/before 变量直到 it 才被初始化。块在宏的主体中,因此您不能将它们作为宏调用的参数引用。

我正在尝试在我正在处理的站点中做本质上相同的事情。我要使用的解决方案是使用一个块调用宏方法,该块将返回您想要的参数散列,然后使用 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, action, &params_block)
it "returns a 401 code if the user is not an admin" do
params = instance_eval &params_block
send verb, action, params
...

关于ruby-on-rails - 如何编写一个 RSpec Controller 宏,它可以接受由 let 或在 before block 中定义的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com