【发布时间】:2013-07-31 14:50:57
【问题描述】:
我为我们的网络应用程序编写了一个模态幻灯片,它显示了一组文档的导航,并公开了这些文档的各种元数据。
这是应用程序的一个很大的组件,具有深奥的要求,所以我认为它的核心场景(作为验收标准给我)应该是众多但内部一致的。
为了避免在我们的许多场景中都有新的步骤,我调整了 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
问题是,无论我是根据上述非常通用的概念还是涉及在一组特征中重复出现的模式的更具体的抽象,这些都可能对其他深奥的特征造成严重破坏,而这些特征可能更具体解析它们的步骤。我见过的每个 Cucumber 示例都有步骤定义文件,其文件名与特定功能文件具有程序关系,我的假设是在这些情况下,只会调用该步骤定义文件来解析其相关功能中的场景:
+ features
| + step_definitions
| | + global_steps.rb
| | + modal_steps.rb
| | + login_steps.rb
| + modal.feature
| + login.feature
但事实并非如此——我正在努力让自己接受 Cucumber 尝试将每个步骤定义模式应用于每个场景的想法。如果这些测试有任何优点,它们将变得更多,引入新概念,并保持相关性而无需不断重写。我希望能够限制我的步骤的范围,以阻止它们干扰它们不是为它们编写的功能,但不知道如何。想到以下概念性解决方案:
- 使用背景或场景
@tags并仅针对带有这些标签的场景调用步骤 - 在某种包装帮助器或元步骤定义中嵌套步骤定义,由给定的错误背景调用
我对 Ruby 不熟悉,Cucumber 似乎非常单薄,所以一方面我对无限的潜力感到畏惧,另一方面又没有预先确定的实现。有什么想法吗?
【问题讨论】:
标签: ruby testing module cucumber bdd