FactoryGirl在创建记录时不使用active_record保存方法?

时间:2014-03-13 12:38:53

标签: ruby-on-rails factory-bot

我遇到一个问题,即FactoryGirl的create方法无法正常工作,因为我认为应该这样做。我有两个例子,我希望做同样的事情,但他们没有。

示例1

FactoryGirl.create(:subscription, contact: contact)

示例2

FactoryGirl.build(:subscription, contact: contact).save

我的代码中的其他代码段

factory :subscription do        
    contact 
end

factory :contact do
    first_name   Faker::Name.first_name
    last_name    Faker::Name.last_name
    email_address Faker::Internet.email
end

两个示例都在我的测试中运行并创建记录。我检查了这一切,检查了一切运行后的两个对象并检查它们是否有id。但是在我的订阅类中,我将覆盖save方法,如下所示。

def save
    puts 'hello world'
    super
end

我原本以为factory_girl会调用save并打印出来" hello world"因为rails确实如此。例如,如果我调用rails创建或保存方法,它将打印出" hello world"。这让我很难过。

任何帮助解释为什么会这样做是值得赞赏的。

2 个答案:

答案 0 :(得分:2)

看起来FactoryGirl使用模型的save!方法,而不是save。这两种方法都直接调用create_or_update(而不是save!调用save),因此您的自定义save方法永远不会执行。

答案 1 :(得分:0)

我有类似的问题,因为我们使用的是Sequel而不是ActiveRecord。 这是我得到的错误:

 got #<NoMethodError: undefined method `save!' for

我用这种方式解决了它:

module FactoryGirl
  module Syntax
    module Methods

      def create(factory_name, params)
        build(factory_name, params).save
      end
    end
  end
end

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

也许不是太花哨......但是它是一种简单而且非常简单的方法让它运转起来..例如:

my_model = create(:my_model, :username => 'billyidol')