Ruby on rails 为ActiveRecord关联扩展编写规范

Ruby on rails 为ActiveRecord关联扩展编写规范,ruby-on-rails,ruby,unit-testing,activerecord,rspec,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 有没有一个好的方法来考虑这些规格?我应该具体说明什么?由于这些都是关联

例如,给定一个模型

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

有没有一个好的方法来考虑这些规格?我应该具体说明什么?由于这些都是关联,在这里是否可以单独指定
用户
类?

如果您担心用户规范对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
class Foo

然后,您可以在用户模型/规范之外对此进行测试。您可能还希望进行集成测试,以确保用户和Foo以您想要的方式进行交互。您可以使用Rspec实现这一点,但我发现Cucumber更适合于涉及更多逻辑的情况。

不确定这是否只是您尝试执行的一个示例,但您的代码已经内置到ActiveRecord:Read dynamic attribute based中finders@Beerlington--是的,对不起,我的例子不太有创意。我想强调一下
#。。。stuff
part,它不是
ActiveRecord
的动态
find\u或\u create
方法的一部分。我经常使用Cucumber,但我倾向于将其用于更高级别的内容,即在浏览器级别。你有没有在你的模型上直接使用Cucumber进行集成测试?还有,
Foo.find\u或\u create\u或\u bar!(名称、参数)
处理
用户的关联<代码>某些用户.foos.find\u或创建\u或\u栏!(…)
我假设您使用的是Rails 3,这可能不适用于Rails 2:/我通常不使用Cucumber进行较低级别的模型测试,因为这就是Test::Unit或Rspec的设计目的。我的意思是,您需要一个使用这个类方法的更高级别的测试。这实际上只是Rails的一种内置行为,所以对关联方法调用进行单元测试有点多余。我想促使我问这个问题的原因是我刚刚写了一个方法,
#。。。东西
部分相当复杂。我想非常仔细地说明这种行为,以确保正确的行为。
class Foo < ActiveRecord::Base

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

end