2011-01-06 65 views
9

工厂女孩有一个简单的方法来创建一个新的工厂,只有一个不存在?工厂女孩新手:如何创建新的记录,如果还不存在

如果没有简单的方法,最简洁的方法是确保只为一组黄瓜特征(和/或规格)创建一个工厂?

例如,我需要一个'用户'模型中的单个(通用)管理员记录来测试多个黄瓜功能。理想情况下,我希望在每个创建管理步骤都没有包装条件的情况下执行此操作,但不会触及“已存在记录”错误。

任何建议表示赞赏。

+1

你的意思是“创建新实例”而不是“创建一个新的工厂”?工厂创建实例。 – 2011-01-06 08:34:19

回答

8

创建一个帮助器方法来创建或返回一个单例实例。

 
def create_or_return_admin_user 
    @user ||= Factory(:user, :admin => true) 
end 

,然后调用

create_or_return_admin_user
在您的测试

2

你不能在Factory_girl中这样做,你需要创建一个方法来检查记录是否存在或者它是否不在你的数据库中。

如果你在设置(Rspec之前)这样做,你可以确保只有一个记录。

1

我们已经实现了它是这样的:在黄瓜的“背景”场景中的特征文件中的每个“方案”执行前

。因此,在每个功能文件的顶部(在“后台”),我们设置一个用户并为用户提供管理员角色。

现在,这给你一个管理员用户准备好并在每个'场景'中可用。

请注意,由于Cucumber正在处理事务中的记录,因此此管理员用户将无法在数据库中存活。因此,如果您需要在某个功能中为此管理员用户添加某些内容,并从另一个功能中使用此功能,则此方法无法使用。但正如我理解你的问题,你只是想确保你不会尝试创建管理员用户,如果它已经创建。在“后台”中创建管理员用户可确保仅为每个功能创建一次。

请注意,您可以改为在每个“场景”中创建管理员用户。在'场景'末尾,黄瓜会从数据库中删除它,所以在任何时候,你也只有一个管理员用户。然而,这不是干的,不应该完成(除非你在某些'场景'中只需要管理员用户,并且特别要求它不能出现在其他'场景'中)。

黄瓜“背景”例如使用FactoryGirl步骤定义:

Background: 
    Given the following user exists: 
    | Name | Role   | 
    | Admin | Administrator | 

厂定义:

factory :user do 
    name 'John Doe' 
    role 'Guest' 
end