这是一个简单的问题.我有黄瓜步骤,例如:
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,这就是原因!
做这个的最好方式是什么?
最佳答案 在
World范围内定义的实例变量仅在World中可用.步骤定义属于World.你应该把MyValdatorClass放在World by World {MyValdatorClass.new}中.之后在此场景的stepdef中定义的实例变量将在此类和同一场景中的其他步骤定义中可用.
其他一些涉及您问题的想法:
如果你有一个步骤鉴于我们有测试环境,那么:
>你将在所有特征中复制它
>由于当前功能的阅读细节不必要,您的功能变得越来越长,读起来也越来越不舒服
>设置不需要的环境细节需要一些时间
更简单的创建实例的方法是添加帮助方法,为您创建它们:
module InstanceCreator
def user
@user ||= # Create user instance in World
end
#etc
end
World(InstanceCreator)
然后你就可以在需要时使用这个用户(没有任何@或@@).
如果除了创建实例之外还需要其他东西,请使用hooks
你的场景应该是自然的阅读.您不应该使用您需要的步骤来破坏它们,以使您的自动化层工作.
从^开始并以$结尾的正则表达式更好.没有它,步骤定义就变得过于灵活.您的第一步定义也将匹配给定我们有一些具体的测试环境.