Factory Girl Newbie:如果尚未存在,如何创建新记录

时间:2011-01-06 07:58:27

标签: ruby-on-rails cucumber factory-bot

工厂女孩是否有一种简单的方法来创建一个新工厂?

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

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

任何建议表示赞赏。

3 个答案:

答案 0 :(得分:8)

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

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

然后致电

create_or_return_admin_user

在你的测试中。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我们已经实现了这样:

在Cucumber中,“背景”场景在特征文件中的每个“场景”之前执行。因此,在每个功能文件的顶部(在“背景”中),我们设置用户并为用户提供管理员角色。

现在,这为您提供了一个管理员用户,可以在每个“场景”中使用。

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

请注意,您可以在每个“方案”中创建管理员用户。黄瓜会在“场景”结束时从数据库中删除它,所以在任何时候你也只有一个管理员用户。然而,这不是DRY,不应该这样做(除非您在某些“方案”中仅需要管理员用户,并且特别要求它不会出现在其他“方案”中)。

使用FactoryGirl步骤定义的黄瓜'背景'示例:

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

工厂定义:

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