何时在BDD循环中从黄瓜切换到rspec以进行登录过程

我还在尝试理解BDD循环中cucumberrspec的组合。

我为一个非常简单的登录系统定义了以下场景:

 Feature: Log in In order to get access to the application As a user I want to log in Scenario: User logs in successfully Given I exist as a user When I go to the login page And I fill in "username" with "gabrielhilal" And I fill in "password" with "secret" And I press "Login" Then I should see "Welcome gabrielhilal" And I should be redirected to the home page Scenario: User enters wrong email/password combination Given I exist as a user When I go to the login page And I fill in "username" with "gabrielhilal" And I fill in "password" with "wrongpassword" And I press "Login" Then I should see "Invalid username/password combination." And I should see the login page again 

然后,我开始定义等待正确的时刻跳入rspec

我通过了使用FactoryGirl模拟用户并定义步骤的第一步:

 Given(/^I exist as a user$/) do @user = FactoryGirl.create(:user) end 

我为会话添加了路由,控制器和操作:

 When(/^I go to the login page$/) do visit login_path end 

我创建了登录表单:

 When(/^I fill in "([^"]*)" with "([^"]*)"$/) do |field, value| fill_in field, with: value end When(/^I press "([^"]*)"$/) do |button| click_on(button) end 

我在我的布局中添加了flash消息:

 When(/^I should see "([^"]*)"$/) do |arg| page.should have_content(arg) end 

我为主页添加了路由和控制器(static_pages):

 When(/^I should be redirected to the home page$/) do visit home_path end 

我解决了最后一步:

 When(/^I should see the login page again$/) do visit login_path end 

我得到了所有的绿色……我觉得通过这些场景不需要rspec 。 我错过了什么?

我试图了解我应该用rspec测试什么。 用rspec再次测试一切我感觉不对….

我对整个Cucumber / rspec事物的体验如下:在你开始使用BDD和Cucumber时,一切都是绿色的,就像你的例子一样。 你甚至可以在它前面贴一个浏览器来在真实的浏览器中进行测试。 然后你不断添加越来越多的东西到你的黄瓜测试。 这很好,很棒,因为你正在测试你的webapp的整个堆栈(对我来说)是一个很大的优点。 您正在测试用户看到的内容。

但是,在您的测试套件变大之后,您开始执行诸如在返回的页面中测试标记之类的内容,这就是您在重构代码时开始遇到问题的时候。 此外,黄瓜对于大型网站来说速度很慢。

我认为最好的方法是使用尽可能少的Cucumer和尽可能多的RSpec。 它大大加快了测试速度。 因此,使用RSpec测试您的控制器和模型以及使用Cucumber的前端在我看来是正确的方法(大多数时候,没有太多的前端测试)。 对于所有这些东西紧密集成并且你想要检查整个堆栈的区域(例如你用登录做的那样),我认为Cucumber对于这些情况来说是一个很好的工具。

黄瓜是BDD-就是这样。 它用于记录和测试应用程序的行为。 在编写代码以使每个Cucumber步骤通过时,Rspec用于测试您的实现。

到目前为止,您还不需要使用rspec的一个原因是您的代码实际上只是“使用”function(从事物的外观提供)而不是创建function。 当您使用框架时,这种情况会发生很多。

另一个原因是你的黄瓜情景正处于相当低的抽象水平。 关于“如何”登录,有很多细节。 在这个级别上的测试与unit testing空间有些重叠,因此不可否认的是对rspec的需求尚不明显。

如果您在更高的抽象级别编写场景,那么您可能会看到rspec在哪里发挥作用。

为了登录,我会为这条快乐的道路写下这样的东西

 Given I am a user When I login Then I should be logged in 

我可能会写一两条悲伤的道路,例如

 Given I am a user When I login with a bad password Then I should not be logged in 

当您在这个抽象级别工作时,您拥有的场景要少得多(运行时间更短),但细节要少得多。 现在,您可以通过unit testing来涵盖其中的一些细节。 例如,如果我们在您的视图中使用了一个方法login_error_message,那么您可以编写unit testing来说出像

 context 'bad password' login_error_message.should == 'bad password' end context 'bad login' login_error_message.should == 'login not found' end 

虽然您可以编写黄瓜方案来执行此操作,但使用unit testing会更便宜(特别是在运行时测试成本中)。

通常,您希望使用Cucumber来记录您为什么需要能够登录并且您可以登录,但不能指定您的登录方式。 当然,这是一门艺术,高度依赖于你的特定背景,并且对不同的观点持开放态度。 但是如果你想有效地使用黄瓜,你需要为你写的每个场景充分发挥作用。