【发布时间】:2011-10-14 16:49:31
【问题描述】:
有没有办法使用 rspec 有条件地对测试进行分组?我的意思是,有没有办法说“如果这个变量是某个值,运行这组测试。如果这个变量是一些其他变量,运行这组测试”?
需要它的基本示例(显然,它实际上不起作用,但应该向您展示我想要的东西)。假设要测试的用户在别处定义并且当前正在测试的用户是@user。尽管您可能有更好的替代方案,但这很好。
before do
login_as_user(@user) #This logs them in and brings them to the homepage to be tested
page.visit("/homepage")
end
describe "Check the user homepage"
subject {page}
it {should have_content("Welcome, #{@user.name}!")}
if(@user.role=="admin")
it {should have_link("List Users"}
end
end
请记住,我无法控制正在测试的用户 - 例如,我无法即时创建用户,并且不能保证任何给定用户存在,而且我不知道给定用户的角色组合是什么会有。因此,我确实需要某种方式来说明“仅在满足这些条件时才运行此测试”,而不是一种创建可以运行每个测试的情况的方式。
【问题讨论】:
-
我很好奇它的实际用例是什么。
-
我必须为几个权限设置相当复杂的用户编写一些断言测试。最常见的情况是我想检查用户属性以查看他们是否有权查看给定页面 - 如果有,我想运行标准测试,如果他们没有,我想确保他们获得他们正在访问的页面的权限被拒绝页面。需要检查具有各种权限(和权限继承)的各种用户。
-
是否有特殊原因,您不能针对不同的测试环境使用单独的
describe/context块,然后在每个上下文中在before中模拟/存根用户的权限? -
因为我在实际页面上进行验收测试(通过 capybara),所以 mock 不起作用,因为它不是有效的会话数据。除非你的意思不是我认为你的意思。你知道吗,我会在那里抛出一个基本的用例,如果你认为有一种方法可以用描述和存根重写它,请随意 - 如果它有效,我愿意接受。
-
我发现条件逻辑在循环测试时确实有效 - 例如,您可以在此页面上执行类似操作:github.com/rspec/rspec-core/issues/470 但是,这是一个范围问题 - @user 不存在就逻辑而言。嗯...