【问题标题】:How to create a user record using factory girl and cucumber?如何使用工厂女孩和黄瓜创建用户记录?
【发布时间】:2013-05-30 14:07:05
【问题描述】:

我从来没有用过工厂女孩,我从这周开始测试,所以所有这些新东西都让我抓狂。谁能给我解释一个使用工厂女孩创建记录的简单方法。

这是用例。我已经使用 cucumber 创建了一个测试,它创建了一个用户并创建了其他记录,如帐户、用户类别。现在我正在编写第二个测试用例,我说不应该有测试数据(我可以使用从第一个测试创建的数据,但不希望依赖于其他测试用例。)。所以我想用 factory girl 为我创建一个用户和相关的用户记录。这是我的测试,它不使用工厂女孩。

@no-database-cleaner
Feature: Managing users parent child relationships
  In order to use portal
  I want to create parent child relationships

  Scenario:  Creating a child user 
    Given I am on the homepage

    When I attempt to sign in with following user account:
      | email address         | password |
      | abc@company1.com   | password |

    Then I should see "abc@company1.com" message on page
    When I follow "All Child Users"
    Then I should see "Add Sub Child"
    When I click "Add Sub Child"
    Then I should see "Child Sub User"
    And I fill in "Email" with "xyztest@gmail.com"
    And I select "Medium" from "user_filter"
    And I choose "abc_id_yes"
    When I press "Create Child User"
    Then I should see "Child User is successfully created."
    And appropriate records should get created for the child user for new abc_id

在步骤定义中我有类似的代码

Then(/^appropriate records should get created for the child user for new abc_id$/) do
  parent_user = User.find_by_email("abc@company1.com")
  user = User.find_by_email("xyztest@gmail.com")
  account = Account.find_by_user_id(parent_user)
  user.default_filter_level.should be_true
  user.ar_id.should be_true
  user.parent_id.should == parent_user.id
  filter = Filter.find_by_user_id(user.id)
  filter.user_id.should == user.id
  filter.abc_id.should be_true
  filter.account_id.should == account.id
end

那么我如何使用工厂女孩实现相同的结果,这也将创建关联记录。谢谢

【问题讨论】:

  • 向我们展示不起作用的测试。您在这里拥有的东西不会从 FactoryGirl 中受益,因为无需进行任何设置。
  • 我想用工厂女孩进行上述测试。你能解释一下为什么工厂女孩对上述测试没有用吗?我只想确保当我在测试之上运行时,应该没有测试数据,如果没有测试数据高于测试失败。所以使用工厂女孩我可以创建/插入记录到表中并使用上述步骤。
  • 那么,有一个Given 不见了?如果您可以显示您所看到的错误,这将有助于弄清楚您正在尝试做什么。 FactoryGirl 只是模型的构建器,因此您可能缺少一些模型数据。但除非您向我们展示错误,否则我们不知道是哪一个。

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


【解决方案1】:

您是真的,其他测试不应该依赖于这个。对于其他场景,请添加具有以下定义的Given an user with other models exists 步骤:

Given(/^an user with other models exists$/) do
  parent = FactoryGirl.create(:user)
  user = FactoryGirl.create(:user, email: "xyztest@gmail.com" parent_id: parent)
  account = FactoryGirl.create(:account, user_id: user.id)
  FactoryGirl.create(:filter, user_id: user.id, account_id: account.id)
end

在 spec/factories/users.rb 中(您指定默认属性值,但您可以在 FactoryGirl.create() 调用中覆盖它们):

FactoryGirl.define do
  factory :user do
    email "abc@company1.com"
    default_filter_level true
    ar_id true
  end
end

在 spec/factories/filters.rb 中:

FactoryGirl.define do
  factory :filter do
    abc_id true
  end
end

在spec/factories/accounts.rb中(只是一个空工厂,你可以指定你经常需要分配的属性。):

FactoryGirl.define do
  factory :account do

  end
end

请注意,在场景的最后一步中,您不应测试是否创建了适当的模型:

And appropriate records should get created for the child user for new abc_id

改为使用这样的东西:

When I follow "All Child Users"
Then the page should have newly created child user

【讨论】:

  • 我可以把 users.rb 放在 features/support/factories.rb 下吗?我没有规格。
  • 在创建用户时,我还创建了帐户、过滤器。它们之间的关系是 has_one :account, :dependent => :destroy has_one :filter, :dependent => :destroy 所以使用你的代码会解决这个问题,否则我必须编写一个逻辑来在工厂女孩中创建帐户和过滤器。抱歉,如果今天这听起来很愚蠢是我成为工厂女孩的第一天
  • 您可以在config/application.rb 中为FactoryGirl 指定其他目录,如下所示:blog.jetthoughts.com/2011/09/24/…
  • 有了这些关系,你可以尝试这样的事情:factory :user do email "abc@company1.com" default_filter_level true ar_id true account create(:account) filter create(:filter) end
  • 当我尝试创建过滤器和帐户时出现错误,说属性已定义:创建 (FactoryGirl::AttributeDefinitionError)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多