将 Cucumber 视为从外向内测试整个应用程序,其中 RSpec 是特定模块的单元测试。您首先指定您希望应用程序在 Cucumber 中具有哪些行为,然后下拉到 RSpec 并描述使该行为起作用的类和模块。
我花了一段时间才弄明白,但我发现 Cucumber 非常适合从广义上描述您希望您的应用程序执行哪些功能,而 RSpec 非常擅长描述它应该如何实际执行。
所以你会在你的黄瓜故事中说你想要什么样的功能,并编写超级简单的步骤来提供输入和查看输出。然后你下拉到 RSpec 并写下它应该如何做的规范。
假设您的功能是能够在网站上搜索用户名。您可能会编写一个黄瓜功能和第一个(也是第一个)场景,如下所示:
Feature: Search users
In order to find people with similar interests as myself
As a user
I want to search for people
Scenario: Search for similar hobbies
Given there is a search page
And there is a list of hobbies
And one of the hobbies is "full contact ironing"
When I select "full contact ironing"
And press search
Then a list of users with the hobby "full contact ironing" are shown
您运行 Cucumber,它会告诉您缺少的步骤,您复制这些步骤并创建简单的步骤来检查这些内容,但不要编写任何代码。
完成步骤定义后,您可以进入 RSpec 并开始编写有关您希望它如何工作的规范。(黄瓜当然应该失败)
describe "SearchController" do
it "should respond to searches" do
sc = SearchController.new
sc.should respond_to(:search)
end
end
您运行 RSpec 并观察它失败,然后开始编写代码:
class SearchController
def search
end
end
就是这样。现在再次运行您的测试。它应该通过,所以开始变得更具体,并开始描述您将如何实际使用搜索功能。我不想深入研究它,我只是想给你一个想法,即你在 Cucumber 中描述你想要什么,然后描述它应该如何在 RSpec 中实际工作。
当然,您可以在 Cucumber 或 RSpec 中做所有事情,但我真的发现 Cucumber 可以帮助我以非常简单的方式说出我想要的东西,如果我尝试在 RSpec 中这样做,我会陷入细节中。如果我首先使用 Cucumber 来描述我想要的基本功能以及原因,那么我可以进入 RSpec 并说明我希望该功能如何实际工作。
有时您的测试中会出现重复,这不是很干燥,但如果您将其视为一个详细程度的问题,它可能不会那么困扰您。一开始我做了很多重复的工作,直到我意识到我应该在 Cucumber 中概括地说我想要什么,然后在 RSpec 中具体说我想要什么。
这只是一个新手关于如何使用这些工具的想法,但到目前为止它似乎对我来说效果很好。我可能给你举了一个可怕的例子,但我只是想从一般细节到我发现在使用这些工具时有用的具体细节。