【问题标题】:Factory Girl Newbie: How to create new record only if doesn't already existFactory Girl Newbie:仅在不存在的情况下如何创建新记录
【发布时间】:2011-06-04 12:23:28
【问题描述】:

工厂女孩有没有一种简单的方法来创建一个新工厂,前提是一个工厂还不存在?

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

例如,我需要一个“用户”模型中的单个(通用)管理员记录来测试多个黄瓜功能。理想情况下,我不想在每个创建管理步骤周围都包含条件,但不会遇到“记录已存在”错误。

任何建议表示赞赏。

【问题讨论】:

  • 您的意思是“创建一个新实例”而不是“创建一个新工厂”吗?工厂创建实例。

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


【解决方案1】:

我们是这样实现的:

在 Cucumber 中,“背景”场景在功能文件中的每个“场景”之前执行。因此,在每个功能文件的顶部(在“背景”中)我们设置了一个用户并赋予该用户管理员角色。

现在,您可以在每个“场景”中为您提供一个随时可用的管理员用户。

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

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

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

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

工厂定义:

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

【讨论】:

    【解决方案2】:

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

    def create_or_return_admin_user @user ||= 工厂(:user, :admin => true) 结尾

    然后调用

    create_or_return_admin_user

    在你的测试中。

    【讨论】:

      【解决方案3】:

      您不能仅在 Factory_girl 中执行此操作,您需要创建一个方法来检查记录是否存在或不在您的数据库中。

      如果您在设置中执行此操作(在 Rspec 之前),您可以确定只有一条记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        相关资源
        最近更新 更多