6

この単純な例では、DataMapper のbefore :saveコールバック (別名フック) を使用して をインクリメントしますcallback_count。callback_count は 0 に初期化されており、コールバックによって 1 に設定する必要があります。

このコールバックは、次の方法で TestObject が作成されたときに呼び出されます。

TestObject.create()

ただし、次の方法で FactoryGirl によって作成された場合、コールバックはスキップされます。

FactoryGirl.create(:test_object)

理由はありますか?[注: ruby​​ 1.9.3、factory_girl 4.2.0、data_mapper 1.2.0 を実行しています]

完全な詳細は次のとおりです...

DataMapper モデル

# file: models/test_model.rb
class TestModel
  include DataMapper::Resource

  property :id, Serial
  property :callback_count, Integer, :default => 0

  before :save do
    self.callback_count += 1
  end
end

FactoryGirl宣言

# file: spec/factories.rb
FactoryGirl.define do
  factory :test_model do
  end
end

RSpec テスト

# file: spec/models/test_model_spec.rb
require 'spec_helper'

describe "TestModel Model" do
  it 'calls before :save using TestModel.create' do
    test_model = TestModel.create
    test_model.callback_count.should == 1
  end
  it 'fails to call before :save using FactoryGirl.create' do
    test_model = FactoryGirl.create(:test_model)
    test_model.callback_count.should == 1
  end
end

テスト結果

Failures:

  1) TestModel Model fails to call before :save using FactoryGirl.create
     Failure/Error: test_model.callback_count.should == 1
       expected: 1
            got: 0 (using ==)
     # ./spec/models/test_model_spec.rb:10:in `block (2 levels) in <top (required)>'

Finished in 0.00534 seconds
2 examples, 1 failure
4

3 に答える 3

3

少なくともfactory_girl 4.2(サポートされているバージョンがわからない) については、カスタム メソッドを使用してオブジェクトを永続化する別の回避策があります。Github の issue への回答に記載されているように、 のsave代わりに呼び出すだけですsave!

FactoryGirl.define do
  to_create do |instance|
    if !instance.save
      raise "Save failed for #{instance.class}"
    end
  end
end

もちろん、FactoryGirl コアで機能するはずなので理想的ではありませんが、現時点ではそれが最善の解決策であり、現時点では他のテストと競合していません...

注意点は、各ファクトリで定義する必要があることです(ただし、私にとっては不便ではありませんでした)

于 2013-06-14T09:42:07.053 に答える
1

build を使用してオブジェクトをビルドし、save を手動で呼び出します...

t = build(:test_model)
t.save
于 2015-01-22T21:12:29.017 に答える