2012-01-14 121 views
1

定义描述数据库中更改的步骤的最佳实践是什么?黄瓜栏|定义描述数据库中更改的步骤

例如,我有以下情形:

Scenario: Creating a user 
    Given I am on the users creation page 
    When I fill in "Name" with "Chandler Bing" 
    And I click "Create User" 
    Then the user should be added into the database 

我怎样才能更好地确定最后一步:

Then /^the user should be added into the database$/ do 
    User.count.should eq 1 
end 

或者有一些其他的,聪明的方法是什么?

谢谢。

回答

0

我建议使用Pickle gem,它为您定义了许多数据库步骤,它们非常好。

0

我会用两种方法改变它。首先,在较新版本的Cucumber中,Web步骤已被弃用。因此,诸如“当我用”blah“填充”blah“时,现在不鼓励。其次,测试数据库中用户的数量并没有描述完整的情况。您想知道用户是您创建的用户,意思是您最终添加的相同名称和其他任何属性。为了处理这些类型的步骤,我发现自己写场景,如:

Scenario: Creating a user 
    When I create the following users: 
    | name   | 
    | Chandler Bing | 
    | Some Other Guy | 
    Then I should have the following users: 
    | name   | 
    | Chandler Bing | 
    | Some Other Guy | 

然后在你的步骤定义,你会做什么网页步骤,这样做的:

Given /^I create the following users:$/ do |table| 
    table.hashes.each do |row| 
    visit new_user_path 
    fill_in 'Name', with: row['name'] 
    click_button 'Create User' 
    end 
end 

Then /^I should have the following users:$/ do |table| 
    # Ensure users with same name are taken into account 
    table.hashes.size.should == User.count 

    table.hashes.each do |row| 
    user = User.find_by_name(row['name']) 
    user.should_not be_nil 
    end 
end 

的几个注意事项这种方法:

  1. 它允许您的步骤是可重复使用的。如果您想测试否定路径并尝试添加无效用户,则不必编写新的步骤。
  2. 特征文件中较少的样板代码。如果你有一个利益相关者,他们应该更容易阅读这些步骤。
  3. 你实际上正在学习水豚,我知道我个人理所当然地以网页步骤。
  4. 您可以使用更少的代码添加一堆用户。
+0

谢谢详细的答案是,Beerlington。出于某种原因,你的建议似乎对我无法解决。如果我有几个同名的人呢?在这种情况下,我怎么能知道用户是我创建的用户,而不是同名的用户?您的解决方案高度依赖于模型属性的唯一性。 – Shamaoke 2012-01-15 10:53:23

+0

伟大的问题!良好的测试是关于对测试场景有信心。这只是一个例子,显示了编写黄瓜场景的另一种方式,可以给你一些额外的灵活性。没有什么能够阻止您向Then步骤添加额外的断言,该步骤检查表的大小是否等于数据库中的记录数。我会更新我的答案,举例说明这可能如何工作。 – 2012-01-18 13:53:44

0

如前所述Skydreamer,咸菜实在是太棒了,你一定要在你的测试工作使用它,你可以较短,Beerlington与我们分享代码,就像这样:

Feature: Creating a user 
    Scenario: Successful .... 
    Given a user exists with name: "Said" 
    .............. 
    ..............