我遇到一个问题,即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"。这让我很难过。
任何帮助解释为什么会这样做是值得赞赏的。
答案 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')