5

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

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

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

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,这就是为什么!

做这个的最好方式是什么?

4

2 回答 2

3

在World范围内定义的实例变量仅在 World 内可用。步骤定义属于 World。你应该把MyValdatorClassWorld by 放在里面World{MyValdatorClass.new}。之后,之前在此场景的 stepdef 中定义的实例变量将在此类和同一场景中的其他步骤定义中可用。

与您的问题有关的其他一些想法:


如果你有一个 step Given we have the test environment,那么:

  • 您将在所有功能中复制它
  • 由于当前功能的阅读细节不需要的功能,您的功能变得更长且阅读起来更不愉快
  • 设置不需要的环境细节需要一些时间

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

module InstanceCreator
  def user
    @user ||= # Create user instance in World
  end
  #etc
end
World(InstanceCreator)

然后,您只需在需要时使用此用户(无需任何 @ 或 @@)。

如果您除了创建实例之外还需要其他东西,请使用钩子

你的场景应该是自然阅读。你不应该用仅仅为了让你的自动化层工作而需要的步骤来破坏它们。


最好使用从 ^ 开始并以 $ 结尾的正则表达式。没有它,步骤定义变得过于灵活。您的第一步定义也将匹配Given We have the test environment with some specifics

于 2012-07-04T22:53:08.117 回答
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
于 2012-07-02T08:05:51.000 回答