为演示者自定义工厂女孩 linting

Customise factory-girl linting for presenters

如果我让 factory-girl 为演示者执行标准检查,它会失败,并抱怨 save! 没有实现。

是否可以自定义 Presenter 的 linting,使其仅检查是否可以成功构建 Presenter,而不保存它?

主持人

class PostPresenter
  def initialize(post)
    @post = post
  end
end

工厂

FactoryGirl.define do
  factory :post_presenter do
    post
    initialize_with { new(post) }
  end
end

回溯

/Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/linter.rb:14:in `lint!': The following factories are invalid: (FactoryGirl::InvalidFactoryError)

* post_presenter - undefined method `save!' for #<PostPresenter:0x007f8c0b67beb8> (NoMethodError)
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/linter.rb:4:in `lint!'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl.rb:59:in `lint'
    from /Users/agrimm/rails/redacted/spec/support/factory_girl.rb:12:in `block (2 levels) in <top (required)>'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:357:in `run'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1660:in `block in run_hooks_with'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1660:in `each'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1660:in `run_hooks_with'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1626:in `with_suite_hooks'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:114:in `block in run_specs'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/reporter.rb:77:in `report'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:113:in `run_specs'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:89:in `run'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:73:in `run'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:41:in `invoke'
    from /Users/agrimm/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/exe/rspec:4:in `<top (required)>'
    from /Users/agrimm/.rbenv/versions/2.2.0/bin/rspec:23:in `load'
    from /Users/agrimm/.rbenv/versions/2.2.0/bin/rspec:23:in `<main>'

您可以将 skip_create 添加到工厂以完全跳过 to_create 块(通常调用 #save!)。

FactoryGirl.define do
  factory :post_presenter do
    skip_create
    post
    initialize_with { new(post) }
  end
end

或者,您可以实施自定义 to_save 回调:

to_save { post.save! }