我正在使用Capybara测试一个逐步增强的网站上的功能。假设我的功能是在位置的层次结构中导航。非javascript版本包括当我们点击不同的位置时获得页面的新版本。增强的javascript版本打开隐藏的元素,或者通过Ajax加载新信息。
我首先为非javascript版本编写一个测试,它看起来像这样:
When I visit the page for "UK"
And I click "London"
Then I should see the information for "London"
使用默认的mechanize驱动程序,测试失败,我开发了该功能,然后测试通过。
然后,我为javascript版本创建了一个相同的测试,标记为@javascript。它使用javascript驱动程序运行测试,测试通过是因为该功能已经实现。(它在非js流中运行)。然而,我希望javascript版本的测试在这一点上失败,因为该功能尚未用javascript进行增强。
因此,我正在寻找一个好的策略来确定是否有一个全新的页面来自服务器,并确保这两个版本的功能都有效。(我计划将其与pushState集成,这样就不会对更改后的URL进行测试)
我很想听听其他人对此的看法-我不相信Cucumber是适合这份工作的工具,因为你是从用户交互的角度来描述功能的,听起来你的渐进增强的实现将导致基本相同的用户交互。
除此之外,我认为您可能需要考虑在页面本身构建某种测试挂钩来帮助实现这一点。在不知道你的确切情况的情况下很难说什么,但可能是其中之一:
- 页面的脚本增强版本可以向DOM添加一些元素,表明增强是活动的,或者表明数据来自AJAX请求而不是页面加载
- 您可以在每次加载时(从服务器)生成一个随机页面标识符(例如,新的GUID),将其嵌入到DOM中,并断言它在交互后没有更改(在增强版上)。这将是实现既定目标的一种非常简单的方法("确定是否有一个全新的页面来自服务器")
为什么您的javascript"增强"版本与非增强版本工作相同?使用@javascript的黄瓜测试应该是测试,以确保增强功能有效。
例如,*如果javascript打开了一个模态对话框,而不是跟随一个指向新页面的链接,那么测试一下。*如果javascript提交了一个表单并更新了一个值,请测试它。
如果在没有javascript支持的情况下运行,这些测试将失败。