【问题标题】:Rails test data, in the databaseRails 测试数据,在数据库中
【发布时间】:2012-11-01 22:08:12
【问题描述】:

这可能是我的一个基本误解。我的应用程序中有一堆逻辑,它从几个表中收集数据集并将它们组合成内存结构。我想为该逻辑编写测试。

在我看来,fixtures、factory girl 和类似工具构建内存模型实例。如果我进行 activerecord 调用,例如Model.find(foo: 12),这些调用不会仅适用于已保存的记录吗?

【问题讨论】:

    标签: ruby-on-rails activerecord fixtures


    【解决方案1】:

    在大多数情况下,我同意@mrbrdo 的观点:更喜欢rpsec 的存根方法。但是作为一个 Rails 程序员,我认为你必须知道“fixture”和“stub”。

    无论是yaml 文件还是factory girl data,夹具都将保存到数据库中。查看您的config/database.yml 文件以了解它们所在的位置。实际上,当您想确保测试期间数据库中始终存在一些数据时,这很有用,例如具有固定 ID 的“管理员用户”。

    存根,它比夹具更快,因为它不会保存到数据库中,当您想要执行“夹具”无法实现的测试时,它可能非常有用。

    因此,我建议您在实际的编码生活中尝试这两种方法,并根据实际情况选择其中一种。

    【讨论】:

    • 只是补充一点,即使您在所有测试中都需要管理员用户,您仍然不一定需要固定装置或数据库或存根。你可以有一个 before(:each) 和 AdminUser.new 用户名:...这取决于你使用这个管理员用户的方式(如果它真的需要在数据库中),但即使那样你通常也可以逃脱它如果你使用 nulldb。不使用数据库的唯一真正缺点是编写这样的测试通常需要更多时间,但在大多数情况下,测试总体上会更好(更快,更孤立)。
    【解决方案2】:

    你说的不是真的,夹具或工厂女孩使用数据库。不过,我会避免使用固定装置,但现在人们通常不使用它们。

    不过,真正编写测试的正确方法是将 activerecord 调用存根,因为这将使您的测试更快。您要测试的是将数据组合到您的结构中,而不是从数据库中提取数据 - 这部分已经在 activerecord 的测试中进行了测试。

    所以像这样将查找器存根(如果您使用的是 rspec):

    Model.should_receive(:find).with(foo: 12) do
      Model.new(foo: 12, other_attribute: true)
    end
    

    所以当你正在测试的方法调用 Model.find(foo: 12) 时,它会得到

    Model.new(foo: 12, other_attribute: true)
    

    这比实际在数据库中创建它然后将其拉出要快得多,而且对于您正在测试的内容这样做没有意义 - 这并不重要。您还可以在实例上存根保存等,具体取决于您的方法正在执行的操作。请记住,从 DB 检索数据并保存到 DB 都已经在 activerecord 的测试中进行了测试,您没有必要重新进行这些测试 - 只需专注于您的特定逻辑即可。

    【讨论】:

    • 谢谢!!跟进...我的案例涉及 4 个表,它们通过 4 个 belongs_to,has_many 对错综复杂地相互连接。 (基本上 3 个表是沿行、列和页面的索引,第四个模型代表一个值。关键是,会有大量微妙的存根......我看到了速度上的优势,但我很可能会犯错误像在实际代码中一样编写存根。
    • 我不确定你在问什么,但你只需要存根你在测试代码中实际使用的内容。因此,如果您不调用某个关联,那么您不需要存根它。如果您想进行这样的快速测试,可以使用的另一个工具是 nulldb:github.com/nulldb/nulldb。您也可以将 FactoryGirl.build 和 nulldb 一起用于关联。当然,您可以只在数据库中创建记录,这样就可以正常工作(例如使用 factory_girl),只是会慢一些。
    【解决方案3】:

    FactoryGirl 支持多种构建策略,包括一种将记录保存到数据库的策略。

    很简单:FactoryGirl.create(:foo) 将创建一个 foo 并将其保存到数据库中,而 FactoryGirl.build(:foo) 将只创建该对象的内存版本。

    有关构建策略的更多信息,请点击此处:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md,在“使用工厂”部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多