从步骤中的嵌套类访问Cucumber的实例变量的最佳方法是什么?

时间:2012-07-02 04:39:00

标签: ruby cucumber

这是一个简单的问题。我有黄瓜步骤,例如:

Given /We have the test environment/ do
  @user = # Create User model instance
  @post = # Create Post model instance
  # etc...
end

然后步骤中我使用自己的类,它们简化了测试过程:

Then /all should be fine/ do
  # MyValidatorClass has been defined somwhere in features/support dir
  validator = MyValidatorClass.new
  validator.valid?.should be_true
end

在MyValidatorClass实例中,我处理上述实例变量@ user,@ post等。

从MyValidatorClass类实例访问Cucumber变量的最佳和最简单方法是什么?

class MyValidatorClass
  def valid?
    @post
    @user
  end
end

现在我手动将所有参数传递给MyValidatorClass实例:

validator = MyValidatorClass.new @user, @post

但我认为这个目的很糟糕。 我需要更透明的东西,因为我们使用Ruby,这就是原因!

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

World范围中定义的实例变量仅在World中可用。步骤定义属于World。您应该MyValdatorClassWorld{MyValdatorClass.new}置于世界范围内Given we have the test environment。之后在此场景的stepdef中定义的实例变量将在此类和相同场景中的其他步骤定义中可用。

其他一些涉及您问题的想法:


如果你有一个步骤module InstanceCreator def user @user ||= # Create user instance in World end #etc end World(InstanceCreator) ,那么:

  • 你将在所有特色中复制它
  • 由于当前功能的阅读细节不必要,因此您的功能变得越来越不易阅读
  • 设置不需要的环境细节需要一些时间

创建实例的更简单方法是添加将为您创建实例的辅助方法:

Given We have the test environment with some specifics

然后你就可以在需要时使用这个用户(没有任何@或@@)。

如果除了创建实例之外还需要其他内容,请使用hooks

你的场景应该是自然的阅读。您不应该使用只需要使自动化层工作的步骤来破坏它们。


最好让正则表达式从^开始并以$结尾。没有它,步骤定义就变得过于灵活。您的第一步定义也会与{{1}}匹配。

答案 1 :(得分:0)

我找到了可能的解决方案。您应该从实例变量迁移到类变量:

Given /We have the test environment/ do
  @@user = # Create User model instance
  @@post = # Create Post model instance
  # etc...
end

Then /all should be fine/ do
  # MyValidatorClass has been defined somwhere in features/support dir
  validator = MyValidatorClass.new
  validator.valid?.should be_true
end

...    

class MyValidatorClass
  def valid?
    @@post
    @@user
  end
end