Rspec的条件测试?

时间:2011-10-14 16:49:32

标签: ruby testing rspec

有没有办法用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

请记住,我无法控制正在测试的用户 - 例如,我无法动态创建用户,并且不保证给定的用户存在,并且我不知道给定用户的角色组合是什么会的。所以我确实需要一些方法来说“只有满足这些条件才能运行此测试”,而不是创建可以运行每个测试的情况的方法。

3 个答案:

答案 0 :(得分:2)

您可以使用let(或可能let!)来定义登录用户应该是谁。 (显然用适当的工厂/夹具/等替换@regular_user& @admin_user。)

before do
  login_as_user(user)
  page.visit "/homepage"
end
let(:user) { @regular_user }

describe "Check the user homepage" do
  subject { page }
  it { should have_content "Welcome, #{@user.name}!" }

  context "when an administrator" do
    let(:user) { @admin_user }
    it { should have_link "List Users" }
  end
end

答案 1 :(得分:1)

好吧,显然这个问题很简单:@user是一个实例变量,只有在执行测试时才存在。由于这个原因,动态生成测试不适用于实例变量。

但是,通过在任何测试样式块(之前,之后,它或指定)之外的某个地方将其声明为局部变量,您可以访问条件逻辑。

解决方案就像在用户面前取下@符号一样简单。

答案 2 :(得分:0)

在同样的想法中你可以使用静态变量

为了在环境之间轻松切换,我甚至使用系统全局变量

在我的spec_helper.rb中,我设置了默认设置

default_env = {
  'SITE_ROOT' => "http://localhost:3000",
  'ACCOUNT_ID' => 'user',
  'ACCOUNT_PASSWORD' => 'password',
  'SUBMIT_REAL_MONEY' => 'false'
}

# setting default env variables if no ENV ones exists
default_env.each do |const_name, value|
  val = ENV[const_name].nil? ? value : ENV[const_name]
  eval_str = "#{const_name}='#{val}'"
  puts eval_str
  eval eval_str
end

然后我可以在命令行中指定我的设置,调用我的规范:

SITE_ROOT='https://my.production.site/' SUBMIT_REAL_MONEY=true rspec

这是一个简单条件背后的规范:

if SUBMIT_REAL_MONEY == 'true'
  it { should respond_with 200 }
end
相关问题