为ActiveRecord关联扩展编写规范

时间:2011-07-04 17:20:14

标签: ruby-on-rails ruby unit-testing activerecord rspec

,例如,给出一个模型

class User < ActiveRecord::Base
  has_many :foos do
    def find_or_create_or_bar!(foo_name, foo_params)
      # ... stuff
      find_by_name(foo_name) || create!(foo_params) || bar!
    end
  end
end

任何人都可以推荐一种为这种行为编写规范的好方法吗?

describe User do
  describe "#foos" do
    describe "#find_or_create_or_bar!" do
      # ???
    end
  end
end

有没有一种很好的方法来考虑这些规格?我应该指定什么?既然这些是关联,那么甚至可以在这里单独指定User类吗?

1 个答案:

答案 0 :(得分:1)

如果您担心用户规范对Foo模型了解太多,您可以尝试将此逻辑移动到Foo上的类方法:

这样的事情应该有效:

class Foo < ActiveRecord::Base

  def self.find_or_create_or_bar!(name, params)
    # ... stuff
    find_by_name(name) || create!(params) || bar!
  end

end

然后您可以在User model / spec之外测试它。您可能还希望进行集成测试,以确保User和Foo以您希望的方式进行交互。你可以使用Rspec,但是如果涉及更多的逻辑,我发现Cucumber更适合。