如何测试运行SQL查询的方法

时间:2016-04-06 16:49:26

标签: 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

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

澄清 我打算创建这些发票和&amp;与FactoryGirl一起旅行以填补模型。那还能用吗?

1 个答案:

答案 0 :(得分:1)

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

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)。这可能比对所有条件进行一次测试更具可读性。