如何从RSpec的spec文件向控制器传值并为类变量@@userID赋值
RSpec给控制器类变量@@userID赋值的操作方法
直接使用Ruby原生的class_variable_set方法即可完成赋值,不需要修改原有业务代码,具体操作如下:
步骤1:在测试文件的前置钩子中赋值
在你的person_spec.rb对应的测试用例组的before钩子中,调用目标类的class_variable_set方法设置@@userID的值,示例代码如下:
# 请将代码中的YourController替换为你实际存放getperson方法的控制器类名 RSpec.describe YourController, type: :controller do # 每个测试用例执行前赋值 before do # 第二个参数替换为你测试需要用到的userID值 described_class.class_variable_set(:@@userID, 10086) end # 每个测试用例执行后重置类变量,避免污染其他测试 after do described_class.class_variable_set(:@@userID, nil) end # 你的测试用例 it 'returns filtered persons matching the userID' do # 构造测试数据 target_person = Person.create(UserID: 10086, name: '匹配用户') other_person = Person.create(UserID: 10010, name: '不匹配用户') # 调用方法验证结果 result = controller.getperson expect(result).to include(target_person) expect(result).not_to include(other_person) end end
注意事项
- 类变量属于类全局共享,不会随着测试用例的事务回滚自动重置,必须通过
after钩子手动清理,否则会导致后续测试用例结果异常 - 如果可以修改原有业务代码,更推荐给
@@userID添加类 setter 方法,比直接调用class_variable_set更易维护,示例如下:
# 在原有控制器类中添加 def self.userID=(value) @@userID = value end
之后在测试中就可以直接调用described_class.userID = 10086完成赋值。
内容的提问来源于stack exchange,提问作者ozkan08
相关产品推荐
相关产品推荐

