2013-07-31 69 views
7

我已经写了我们的web应用程序模态幻灯片呈现的文档集合导航,并公开各种元数据对这些文件。限制黄瓜步骤或步骤文件到指定的功能或标签

这是深奥的应用要求很大成分的,所以我认为这是不够公平,它的核心情景(给我作为验收标准),应该是既繁多又内部一致。

为了避免对我们的每一个很多情况下一个新的台阶,我已经适应a helper它能把人可读的术语如document caption成选择:

module SelectorsHelper 
    def selector_for(term) 
    case term 
    # Lightbox/modal/fancybox 
    when 'lightbox' 
     '#fancybox-inner' 
    when 'close button' 
     '.document-viewer__tools__close' 

...旁边的几个通用的步骤定义如以下内容:

# Generic click action 
When(/^I click (?:on)?(?:the |a)'(.*?)'?$/) do |element| 
    find(selector_for(element)).click 
end 

的问题,我是否作用于非常通用的概念,与涉及的功能集内复发即图案,上面的或更具体的抽象的是,这些可能肆虐w ^还有其他深奥的功能,可能有更多的具体步骤来解析它们。我见过的每个Cucumber示例都有步骤定义文件,其文件名与特定功能文件具有程序关系,我的假设是,在这些情况下,只会调用该步骤定义文件来解析相关功能中的场景:

+ features 
| + step_definitions 
| | + global_steps.rb 
| | + modal_steps.rb 
| | + login_steps.rb 
| + modal.feature 
| + login.feature 

但事实并非如此 - 我挣扎着自己辞职,黄瓜尝试应用步骤定义模式,以场景的概念。如果这些测试将有任何优点,它们将会变得更多,引入新的概念,并保持相关性,而不需要连续重写。我希望能够限制我的步骤范围,以阻止它们干扰未写入的功能,但不知道如何。以下概念性方案浮现在脑海中:

  • 使用背景或场景@tags并调用步骤仅适用于场景与这些标签
  • 接下来的步骤定义在某种包装的辅助或可变步骤清晰,用一个调用给出的错误背景

我对Ruby不熟悉,而且Cucumber看起来非常薄,所以我一方面无限潜力,另一方面没有预先确定的实现。有任何想法吗?

回答

4

以我的经验过于笼统步骤导致极难维护自动化的代码库。尽可能在这里寻求平衡,只有你可以判断这个平衡点在哪里。你不需要过分重复的步骤定义,但你不想要一个超级通用的恶梦来调试。

有可能使用某种解决方法获取到标签的列表,但请千万不要这样做。这很粗俗,很奇怪,而不是打算如何使用黄瓜。

作为一种变通方法在你step_definitions你可以使用一个围绕步骤以从情景获取标记名称的列表 - 在step_definition身体检查

Around do |scenario, block| 
    begin 
    @tag_names = scenario.tags.collect { |tag| tag.name } 
    block.call 
    ensure 
    $tags = nil 
    end 
end 

然后,如果你要检测的标签包括在列表 -

Given(/^I am testing a step with a "([^"]*)"$/) do |arg| 
    if @tag_names.include?('@a_tag') 
    puts 'Executing a step definition with tag - @a_tag' 
    else 
    puts 'Executing a step definition without tag - @a_tag' 
    end 
end 

此功能 -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

,结果t他的输出 -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1    # features/example.feature:4 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition with tag - @a_tag 

    Scenario: Example scenario #1    # features/example.feature:7 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition without tag - @a_tag 

2 scenarios (2 passed) 
2 steps (2 passed) 
0m0.004s 

再次,我认为使用这是一个令人难以置信的坏主意。最好稍微重复步骤定义,易于跟踪和调试,然后有一个超级通用步骤定义来统一它们!

编辑 - 重新阅读您的问题和博客文章后,我不认为这真的回答你的问题。然而,我相当肯定你正在试图做一些非黄瓜色的东西

+0

我想我的问题是寻找一个非常具体的解决方案,以一个令人难以置信的通用困境。这是我所希望的一个很好的问题。你的建议 - 不是如何打算使用黄瓜 - - 很有意义。如果我回到使用黄瓜,我会遵循这个建议! – Barney