ruby-on-rails - 如何测试运行 SQL 查询的方法

标签 ruby-on-rails unit-testing factory-bot minitest

我做了一个自定义 SQL 查询,我想创建一个单元测试来证明它的工作原理。我已经在 SQLDeveloper 中对其进行了测试,它在我的测试数据库上按我希望的方式工作,但我想为以后必须维护此代码的人留下一个单元测试。

def report_of_merchants_who_have_not_pressed_the_service_rendered_button
    sql = "SELECT MIN(departure_date), ch_invoice.invoice_id
    FROM ch_invoice
    INNER JOIN ch_trip
    ON ch_invoice.invoice_id = ch_trip.invoice_id
    WHERE departure_date < SYSDATE
    AND service_rendered = 0
    AND paid = 1
    Group By ch_invoice.invoice_id"

    report = ActiveRecord::Base.connection.exec_query(sql)
    render json: report
  end

我的想法是创建四张发票,其中三张不符合上述标准,一张符合。我遇到的问题是如何检查查询是否只返回一个响应。如何测试查询的一行是否出现?

澄清
我打算用 FactoryGirl 创建这些发票和旅行来填充模型。那还能用吗?

最佳答案

将此方法包装在一个类中。

class MerchantReport
  class << self
    def for_not_pressed_the_service_rendered_button
      sql = "SELECT MIN(departure_date), ch_invoice.invoice_id
      ....    
      ActiveRecord::Base.connection.exec_query(sql)
    end

在你的测试中,
report = MerchantReport.for_not_pressed_the_service_rendered_button

FWIW,我认为像报告这样的查询与发票或其他模型没有任何关系,并且属于它们自己的类。

是的,您可以在设置中创建 4 张发票。此外,您可以为要测试的每个条件创建单独的测试。例如,您可以对日期进行一项测试 ( departure_date < SYSDATE )。这可能比对所有条件进行一项测试更具可读性。

关于ruby-on-rails - 如何测试运行 SQL 查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457429/

相关文章:

ruby-on-rails - Rails has_and_belongs_to_many 总是插入到数据库中

mysql - Rails 两个键上的左连接不返回连接字段

c# - 在单元测试中确定线程安全

java - JMockit : How to inject a MockUp class into a tested class?

ruby-on-rails - 将 factory_girl 与 PaperClip 4.0 结合使用

ruby-on-rails - 如何在不破坏 FactoryGirl 的情况下将 seeds.rb 加载到测试数据库中?

sql - Rails 分页 - 从实例 ID 中查找页码

ruby-on-rails - 无法在 Rubymine 或 Vim for Rails 6 中保存和编辑 credentials.yml.enc

unit-testing - 在 Nestjs 中 Jest 单元测试模拟 google oauthClient

ruby-on-rails - <top (required) >': undefined method ` build'中的rspec-rails和工厂女孩 block