关于默认作用域(Default Scope)的Rspec测试是否正确的咨询
你的默认作用域测试用例不正确,原因及修正方案如下
问题分析
你当前的测试用例只是验证了enum的属性映射关系,完全没触及默认作用域的核心功能:默认作用域是在执行数据库查询时自动过滤flg = '0'的记录,而你用build(:user)只是在内存中创建对象,不会触发任何数据库查询,自然无法测试默认作用域的效果。
正确的测试思路
要测试默认作用域,需要验证:当数据库中存在不同flg值的用户时,执行User.all(或其他查询方法)只会返回flg = '0'的用户。
修正后的测试用例
describe 'default scope' do it '只返回flg为"0"的用户' do # 创建两个用户,一个符合默认作用域条件,一个不符合 enabled_user = create(:user, flg: "0") disabled_user = create(:user, flg: "1") # 执行查询,验证结果只包含符合条件的用户 expect(User.all).to include(enabled_user) expect(User.all).not_to include(disabled_user) end end
补充说明
- 用
create而不是build:create会把对象存入数据库,这样才能触发基于数据库查询的默认作用域逻辑。 - 单独验证enum映射(可选):如果你需要单独验证enum的映射关系,可以单独写一个测试用例:
describe 'deleted_flg enum' do it '正确映射flg值到enum状态' do enabled_user = build(:user, flg: "0") expect(enabled_user.deleted_flg).to eq("enabled") disabled_user = build(:user, flg: "1") expect(disabled_user.deleted_flg).to eq("disabled") end end
内容的提问来源于stack exchange,提问作者Kumar Nikhil
相关产品推荐
相关产品推荐

