这是一个简单的问题。我有黄瓜步骤,例如:
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,这就是原因!
这样做的最佳方式是什么?
答案 0 :(得分:2)
World范围中定义的实例变量仅在World中可用。步骤定义属于World。您应该MyValdatorClass
将World{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