0

假设我有一个 event_type 模型,它有一些事件类型,例如“live”、“used”、“offline”。

这些类型在我的另一个名为 Event 的模型中使用。现在,在测试时,我需要在每次运行时填充所有类型。更具体地说,这是我的事件工厂:

factory :event do |e|
    e.event_type {|v| v.association(:event_type)}
    e.latitude 40.767929000000
    e.longitude -73.985742000000
end

我在事件工厂上试过这个:

after(:create) {|event|
  FactoryGirl.create(:event_type, {:name => "live"})
  FactoryGirl.create(:event_type, {:name => "used"})
  FactoryGirl.create(:event_type, {:name => "offline"})
}

这种方法的问题在于,如果我创建了多个事件对象,则所有事件类型都会为我使用的每个事件再次创建。

什么是更好的方法?

谢谢,

4

2 回答 2

1

您必须在运行测试的 _spec 中执行此操作。(或测试)

在 RSpec 中,您可以在规范顶部的 before 块中执行此操作。

require 'spec_helper'

describe Event do 

  before do 
    FactoryGirl.create(:event_type, {:name => "live"})
    FactoryGirl.create(:event_type, {:name => "used"})
    FactoryGirl.create(:event_type, {:name => "offline"}) 
  end

  it "tests something" do 
    ...
  end 
end

你也可能正在尝试做 Trait 的用途......所以在你的工厂里

factory :event do |e|

  e.latitude 40.767929000000
  e.longitude -73.985742000000

  trait :live
    e.event_type = "live"
  end

  trait :used
    e.event_type = "used"
  end

  trait :offline
    e.event_type = "offline"
  end

  # defining these is not necessary but may save you some time
  factory :event_live, traits: [:live]
  factory :event_used, traits: [:used]
  factory :event_offline, traits: [:offline]
end

这将允许您基于它们创建工厂:

FactoryGirl.create :event, :live

或者你可以调用上面显示的“不必要的工厂”

FactoryGirl.create :event_live

但是,如果 event_type 是一个关联,那么您可能需要在一个单独的工厂中定义特征,您可以像这样利用它:

trait :live do 
  e.association :event_type, factory: :event_type
end

希望这可以帮助!

您可能还想利用Database Cleaner gem 在每次运行之间清除项目,这样您就不会遇到唯一的验证错误。

于 2013-09-24T20:16:08.737 回答
0

一种解决方案是将值直接填充到测试数据库中。如果您正在使用事务性固定装置(spec_helper 中的 config.use_transactional_fixtures = true),则不必担心它会被意外删除。如果将其放入固定装置中,如果它确实丢失了,您可以轻松地重新导入它。

于 2013-09-24T19:40:19.223 回答