首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FactoryGirl在工厂中更改属性结构

FactoryGirl在工厂中更改属性结构
EN

Stack Overflow用户
提问于 2015-11-03 17:40:41
回答 1查看 282关注 0票数 0

FactoryGirl 4.5.0

如何更改传递属性的结构?例如,当使用大量现有测试时,当序列化现有字段时,工厂希望使用旧属性来创建新模型。

解释

考虑到翡翠模型:

代码语言:javascript
复制
# app/models/emerald.rb
class Emerald < ActiveRecord::Base
  validates_presence_of :name, :size, :shinyness, :color
end

翡翠工厂:

代码语言:javascript
复制
# spec/factories/emerald_spec.rb
FactoryGirl.define do
  factory :emerald do
    sequence(:name) {|n| "Emerald #{n} name"}
    size: 12
    shinyness: 34
    color: 'Dark Green'
  end
end

还有许多rspec测试,它们做的事情如下:

代码语言:javascript
复制
let(:shiny_emerald) { create(:emerald, attributes: { name: 'Shiny', shinyness: 99 })}
let(:big_emerald)   { create(:emerald, attributes: { name: 'Big', size: 888 })}

当串行化翡翠上的一些字段时,我们得到

代码语言:javascript
复制
# app/models/emerald.rb
class Emerald < ActiveRecord::Base

  serialize :emerald_properties, Hash

  validates_presence_of :name
  validates :emerald_properties, emerald_properties: true # This is a custom validator

  def size
    emerald_properties[:size]
  end
  def size=(value)
    emerald_properties[:size] = value
  end
  def shinyness
    emerald_properties[:shinyness]
  end
  def shinyness=(value)
    emerald_properties[:shinyness] = value
  end
  def colour
    emerald_properties[:colour]
  end
  def colour=(value)
    emerald_properties[:colour] = value
  end
end

“你为什么不做一个不同的方法,这在这个例子的有限范围内可能是可能的,但不适用于任何可能搜索这个*”的人,除了工厂,应该做什么让现有的测试保持不变?

该模型仍然允许您使用emerald.size而不是强制使用emerald.emerald_properties[:size],我的目标是实现与工厂相同的功能。

这是许多工作要做的:

代码语言:javascript
复制
let(:big_emerald) { create(:emerald, attributes: { name: 'Big', emerald_properties{ size: 888 }})}

在任何地方,目标都是

代码语言:javascript
复制
let(:big_emerald) { create(:emerald, attributes: { name: 'Big', size: 888 })}

并在工厂内部进行调整。

到目前为止,我已经:

代码语言:javascript
复制
FactoryGirl.define do
  factory :emerald do
    sequence(:name) {|n| "Emerald #{n} name"}
    emerald_properties ({ {size: 12, shinyness: 34, color: 'Dark Green'}.merge(attributes.slice(*[:size, :shinyness, :color])) })
  end
end

但不起作用

EN

回答 1

Stack Overflow用户

发布于 2015-11-03 18:00:39

这是唯一必要的‘双括号’时,不做内联。

How to define an array / hash in Factory Girl?的误解

代码语言:javascript
复制
# valid
favorites {{
  "PETC" => "http://www.petc.org"
}}
# invalid
favorites {
  "PETC" => "http://www.petc.org"
}
# invalid
favorites {{ "PETC" => "http://www.petc.org" }}
# valid
favorites { "PETC" => "http://www.petc.org" }

因此,该解决方案在删除未使用的大括号后工作:

代码语言:javascript
复制
FactoryGirl.define do
  factory :emerald do
    sequence(:name) {|n| "Emerald #{n} name"}
    emerald_properties { {size: 12, shinyness: 34, color: 'Dark Green'}.merge(attributes.slice(*[:size, :shinyness, :color])) }
  end
end

而且,它们不是不必要的{},而是不必要的()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33505707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档