ruby-on-rails - 您如何在不对ActiveRecord::Base方法进行使用做任何假设的情况下对它们进行 stub ?

标签 ruby-on-rails unit-testing activerecord stubbing

ActiveRecord::Base具有强大的API,其中包含用于查找和保存对象的多种方法。例如,您的AR::B对象可能已通过多种方法实例化:

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos(关联)
  • …以及关于关联的查找器方法,当然是

  • 同样,有问题的对象可能会通过几种不同的方法持久化:
  • foo.createfoo.create!
  • foo.savefoo.save!
  • foo.update_attributesfoo.update_attributes!

  • 现在,在编写单元测试时,最好对外部方法调用进行 stub ,以便您的测试可以专注于所讨论方法的业务逻辑。但是,当涉及到AR::B对象时(例如在 Controller 单元测试中),似乎您必须致力于上述方法之一,而实际上就该方法的业务逻辑而言,则不应该您选择的重要。

    您是否必须将方法的行为与此实现紧密结合,还是我错过了一些简单的方法?

    最佳答案

    一种方法是以这样的方式构建类:将所有ActiveRecord::Base方法调用包装在自己的方法中。

    因此,与其直接调用Foo.new(…),不如...

    class Foo < ActiveRecord::Base
      def self.create_object(…)
        new(…)
      end
    end
    

    这样,在测试中,您可以 stub 自己的方法,而不是ActiveRecord的方法。

    Avdi Grimm在“Objects On Rails”一书中详细概述了这种方法(包括其好处)... http://objectsonrails.com

    关于ruby-on-rails - 您如何在不对ActiveRecord::Base方法进行使用做任何假设的情况下对它们进行 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718822/

    相关文章:

    ruby-on-rails - Activerecord - 保存所有关联对象后的回调

    c# - 像在 WebOperationContext 中一样在模拟 WebOperationContext 中执行 CreateTextResponse(...)

    python - 用 Nose 比较物体

    ruby-on-rails - 使用“belongs_to”和“has_many”保存时,Rails 模型错误未知属性

    ruby-on-rails - 为什么 Date.today 在数据库中插入以前的日期?

    ruby-on-rails - rake 数据库 :migrate giving 'unexpected\n' error

    php - Codeigniter 事件记录左连接

    mysql - Sql 查询获取 Rails 中最受欢迎的帖子

    javascript - 我们如何在 ruby​​ on Rails 文档中使用 d3.js?

    c++ - 具有许多测试的 CMake 单元结构