gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:31:43 25 4
gpt4 key购买 nike

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com