在匹配之前修改黄瓜中的步骤文本

时间:2011-01-24 20:26:44

标签: cucumber

我们想要通过在Cucumber中加入“特殊常量”来解决一些配置问题。例如,我们希望在步骤中使用文本"__USER__"的任何地方,应该用运行应用程序的当前用户替换(以便我们可以测试用户权限等内容)。

我试图采取的策略是做这样的事情:

BeforeStep do |step|
    domain = get_domain()
    username = get_username()
    step.text.gsub("__USER__", "#{domain}/#{username}")
end

但是,没有BeforeStep。我尝试使用Before do |scenario| ... end,但该方案没有我可以使用的任何东西。我们如何在代码中将"__USER__"的实例替换为用户(以及"__CURRENT_DATE__"的实例与当前日期等)?

2 个答案:

答案 0 :(得分:0)

我通常使用黄瓜通过视图记录用户,然后从那里运行测试。

类似的东西:

Given a user exists with email: "user@gmail.com", account_type: "customer" 
When I go to the homepage 
And I follow "Sign in" 
And I fill in "email" with "user@gmail.com" 
And I fill in "password" with "password" 
And I press "Sign in"

答案 1 :(得分:0)

我认为这是编写更多声明性步骤的情况,例如When the user logs in而不是像When I fill in "txt_user_name" with "fred"这样的事情。在这种情况下编写步骤定义会很容易:

When /^the user logs in$/ do
    domain = get_domain()
    username = get_username()
    fill_in "txt_user_name", :with => "#{domain}/#{username}"
end

您甚至可以引入步骤参数转换,将文本“用户”转换为您需要的用户名,这样您就不必重复进行更改:

CAPTURE_USER = Transform /^(the user)$/ do |this_isnt_used|
    domain = get_domain()
    username = get_username()
    "#{domain}/#{username}"
end

When /^(#{CAPTURE_USER }) logs in$/ do |user_name|
    puts "Logging in as #{user_name}"
end

这将与步骤Given the user logs in匹配,并将正确的用户名作为参数传递。

另外,回顾一下你的问题,你可以使用一个转换来完成你想要做的事情并让它替换__USER__的实例,但我不会自己选择那个选项 - 感觉就像它会过多地影响场景的可读性。你的选择虽然!