为演示者定制工厂女孩linting

时间:2015-07-29 23:19:09

标签: ruby-on-rails factory-bot lint

如果我让工厂女孩为演示者做标准的linting,它会失败,抱怨save!没有实现。

是否可以自定义演示者的linting,以便仅检查它是否可以成功构建演示者,但不能保存它?

演示

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>'

1 个答案:

答案 0 :(得分:2)

您可以将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! }