【问题标题】:FactoryGirl not passing arguments in buildFactoryGirl 没有在构建中传递参数
【发布时间】:2015-06-06 04:55:38
【问题描述】:

我有一个 ruby​​ 应用程序,我正在使用 rspec 和 factorygirl,但我在建造工厂时遇到了麻烦。当我运行规范时,我得到一个 ArgumentError: missing keywords 用于初始化所需的关键字。如果我明确地传递它们,错误将变为wrong number of arguments 0 for 2。

感谢您对此的任何帮助。

spec/models/player_spec.rb

require 'spec_helper'

describe Player do

  it 'has a valid factory' do
    player = build(:player) # or build(:player, name: 'testname', password: 'testpw')
  end
end

spec/factories/player.rb

FactoryGirl.define do
  factory :player do
    name     { 'Testname' }
    password { 'testpass' }
  end
end

models/player.rb

def initialize(name:, password:)
  @id       = object_id
  @name     = name
  @password = password
end

【问题讨论】:

  • 您可以编辑您的问题并添加错误跟踪吗?
  • 您的关键字是否必须是必需的,或者您可以这样做:def initialize(name: nil, password: nil)?

标签: ruby testing rspec factory-bot


【解决方案1】:

将您的 spec/factories/player.rb 更改为:

FactoryGirl.define do
  factory :player do
    name      'Testname'
    password  'testpass'

    initialize_with { new(name:name, password: password) }
  end
end

您可以找到文档here,尽管在这种情况下并未明确使用。

【讨论】:

  • 谢谢!这为我解决了这个问题(Rails 4.2.3,Ruby 2.2.2)。
【解决方案2】:

您是否尝试使用他们在 github 存储库 Read Me 中推荐的语法? 看起来定义工厂是使用以下语法完成的:

FactoryGirl.define do 
  factory :player do 
    name 'Testname' 
    password 'testpass'
  end
end

它们可能是等效的,但这对我来说是一个潜在的问题。似乎每当您执行逻辑而不是声明时都会使用块。

【讨论】:

  • 在这种情况下,这些块是不必要的,但它们是有效的。块可用于在构建时计算属性,而不是在定义工厂时。
【解决方案3】:

我终于通过将 player#initialize 方法更改为接受选项哈希而不是关键字参数参数来实现这一点。

【讨论】:

  • 这实际上不是解决方案,而是一种解决方法。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多