标签: factory-bot

铁路工厂女孩得到"电子邮件已被采取"

这是我的工厂女孩​​代码,每次我尝试生成一个评论时,它告诉我"电子邮件已经被拍摄",我重置了我的数据库,将spec_helper中的转换设置为true,但仍然没有解决问题.我是新来的,我使用该关联错了吗?谢谢!

Factory.define :user do |user|
  user.name                  "Testing User"
  user.email                 "test@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

Factory.define :course do |course|
  course.title "course"
  course.link "www.umn.edu"
  course.sections 21
  course.description "test course description"
  course.association :user
end

Factory.define :review do |review|
  review.title "Test Review"
  review.content "Test review content"
  review.association :user
  review.association :course
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails factory-bot

14
推荐指数
4
解决办法
7628
查看次数

使用factory_girl编写工厂时,从数组中随机选择项目的正确方法是什么?

如果我在模型中的模块中定义了类型,并且在同一模型中也定义了这些类型的数组,那么在定义新工厂时如何随机调用此数组中的值?

谢谢!

约翰

ruby-on-rails factory-bot

14
推荐指数
1
解决办法
3122
查看次数

Rail 3.2.2/Devise:rspec的弃用警告

我最近将应用程序升级到rails 3.2.2.

我正在使用Factory_girl

Factory.sequence:name do | n | "名字 - #{n}"结束

Factory.define:用户执行| u | u.first_name {Factory.next(:name)}
u.last_name {| u | 'last_'+ u.first_name}
u.password'secret'u.password_confirmation {| u | u.password} u.sequence(:email){| i | "user_#{i}@example.com"}

结束

而这个简单的测试

指定{Factory.build(:user).should be_valid}

生成以下警告

弃用警告:您正在尝试创建属性user_id'. Writing arbitrary attributes on a model is deprecated. Please just use attr_writer`等(从块中调用(2级)...

我怎么能摆脱它?

rspec ruby-on-rails-3 factory-bot

14
推荐指数
2
解决办法
3842
查看次数

如何在Ruby on Rails中使用FactoryGirl创建具有嵌套属性的测试对象?

我有一个Invoice可能包含许多模型的模型Items:

class Invoice < ActiveRecord::Base

  attr_accessible :number, :date, :recipient, :items_attributes

  belongs_to :user

  has_many :items

  accepts_nested_attributes_for :items, :reject_if => :all_blank, :allow_destroy => true

end
Run Code Online (Sandbox Code Playgroud)

我试图使用RSpec测试这个:

describe InvoicesController do

  describe 'user access' do

    before :each do
      @user = FactoryGirl.create(:user)
      @invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
      sign_in(@user)
    end

    it "renders the :show view" do
      get :show
      expect(response).to render_template :show
    end

  end

end
Run Code Online (Sandbox Code Playgroud)

不幸的是,此测试(以及所有其他测试)失败并显示来自RSpec的此错误消息:

Failure/Error: @invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: items
Run Code Online (Sandbox Code Playgroud)

如何创建包含可通过测试的项目的发票?

我正在使用FactoryGirl来制作这样的对象:

factory :invoice do
  number { Random.new.rand(0..1000000) } …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails rspec2 ruby-on-rails-3 factory-bot

14
推荐指数
1
解决办法
2万
查看次数

在前端运行集成/验收测试.需要一个前端API来告诉Rails为每个测试设置哪个数据库状态

我的前端是一个基于EmberJS的应用程序.它本质上是完全异步的,所以用Capybara测试它是痛苦痛苦.另一方面,Ember提供了一个开箱即用的优秀测试套件,使验收测试变得有趣和有效.

通常情况下,使用固定装置或后端模拟验收Ember应用程序.但是对模拟的测试并不能让我满意:

  • 它不会揭示后端和前端之间可能的API不一致,竞争条件等.
  • 以这种方式测试后端业务逻辑是不可能的.这些测试不是集成测试.
  • 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为.这非常繁琐,你有效地最终实现了两个后端.

所以我想测试真正的后端!设置Ember以使用本地后端实例进行测试是微不足道的.但问题是后端将在各个测试甚至测试会话之间保持其状态.

这就是为什么我想在Rails中实现一个特殊的公共API:

  • 只有在使用特定标志或env var运行Rails时,API才可用.
  • Rails以非测试模式运行,提供正常的API调用,就像在生产中一样.
  • 在每次测试之前,前端调用特殊API,告诉Rails这个特定测试需要哪个数据库设置.
  • 当收到对特殊API的调用时,Rails会清理数据库并使用请求的数据填充它.例如,要从购物车中测试项目删除,数据库应该在购物车中有三个项目.
  • Rails完成API请求,前端开始测试.
  • 前端运行测试步骤,使用正常的后端API,就像在生产中一样:登录,创建帖子,评论它们.它还会尝试做一些禁止的事情,例如在未登录时编辑帖子,超出文本长度限制等,并验证后端是否拒绝禁止的操作.
  • 当前端运行下一个测试时,它将再次调用特殊API.对于此特定测试,Rails将丢弃先前测试产生的状态并设置新测试状态.

我是一个对Rails有粗略了解的前端开发人员.Factory GirlDatabase Cleaner似乎是适合这项工作的工具,但绝对没有关于如何在Rails正常测试环境之外使用它们的信息.我想我需要一个控制器或一个Rails引擎.

所以问题是:如何在Rails中创建一个API,前端可以使用它来告诉Rails使用fixture工厂设置某个数据库状态,而Rails则以非测试模式运行,即提供REST API和没有通过RSpec/Capybara/Cucumber运行?

额外功能:应在前端定义夹具工厂属性,以便将测试代码存储在一个位置.因此,后端应该能够通过特殊API接受夹具工厂属性.默认值仍然可以在后端的代码库中定义.

我相信这可能成为验收/集成测试的最佳实践.如果我设法实现它,我保证发布一个gem.

integration-testing ruby-on-rails acceptance-testing database-cleaner factory-bot

14
推荐指数
1
解决办法
756
查看次数

在Factory_girl/machinist的Singleton工厂?

在工厂女孩/机械师的工厂中是否有一些配置强制它在测试用例期间只创建一次具有相同工厂名称的对象并且一直返回相同的实例?我知道,我可以这样做:

def singleton name
    @@singletons ||= {}
    @@singletons[name] ||= Factory name
end
...
Factory.define :my_model do |m|
   m.singleton_model { singleton :singleton_model }
end
Run Code Online (Sandbox Code Playgroud)

但也许有更好的方法.

singleton machinist factory-bot

13
推荐指数
2
解决办法
2605
查看次数

工厂女孩嵌套工厂

我有一个属于角色模型的帐户模型.

factory :role do
  name "student"
end

factory :account do
  user
  role
end
Run Code Online (Sandbox Code Playgroud)

第一个工厂创建一个名为"student"的角色.第二个工厂创建一个帐户,该帐户与在上一个工厂中创建的学生角色相关联.它也与用户相关联......这对于这个问题并不重要.

我有很多要测试的角色(管理员,学生,助理)......我不想在角色工厂中指定'学生'......这太静态了.如何指定创建帐户工厂时要创建的角色?喜欢:

  factory :account do
    user
    role_id { factory :role { name: "admin"} }
  end
Run Code Online (Sandbox Code Playgroud)

完成此任务的最佳方法是什么?

ruby-on-rails-3 factory-bot

13
推荐指数
1
解决办法
2万
查看次数

如何获得FactoryGirl中的随机数?

FactoryGirl是否可以定义0-10的随机数?

    factory :rating do
       ranking 1 #random number?
       recipe
    end
Run Code Online (Sandbox Code Playgroud)

我真的希望生成的排名数是0-10之间的随机值.

我想用不同的数字生成评级,但不想在rspec中明确定义它们.这将用于显示评级数字中的平均值和其他统计数据.例如:10多个,0个多少,平均等等.

rspec factory-bot

13
推荐指数
2
解决办法
9942
查看次数

undefined方法`create'track spec.

我已经安装了工厂女孩并尝试使用它与规格.

scenario 'User signs in' do
  create :user, email: 'test@example.com', password: 'testpassword'
  visit '/users/sign_in'

  fill_in 'Email', with: 'test@example.com'
  fill_in 'Password', with: 'testpassword'
end
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.

Failure/Error: create :user, email: 'test@example.com', password: 'testpassword'
 NoMethodError:
   undefined method `create' for #<RSpec::ExampleGroups::UserSignIn:0x007fe6324816b8>
Run Code Online (Sandbox Code Playgroud)

rspec factory-bot

13
推荐指数
2
解决办法
7095
查看次数

如何访问在before子句中创建的has_many模型

有一个Companyhas_many QuarterValue,我有一个RSpec测试.

  let(:company) { Company.create }
  describe 'company has many quarter values' do
    before do
      10.times { create(:quarter_value, company: company) }
    end
    it 'has 10 quarter values' do
      expect(company.quarter_values.count).to eq(10)
    end
  end
Run Code Online (Sandbox Code Playgroud)

测试通过.我的问题是,当我放在我无法访问binding.pryexpect匹配器上方时company.quarter_values,返回空数组[].

如何使用?访问测试中的has_many模型对象?RSpecbinding.pry

投机/ factories.rb

FactoryGirl.define do
  factory :company do
    sequence(:code) { |n| n + 1000 }
  end
  factory :quarter_value do
    company
  end
end
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails ruby-on-rails-4 factory-bot

13
推荐指数
1
解决办法
120
查看次数