2016-04-06 14 views
3

私はカスタムSQLクエリを作成しましたが、それが機能することを実証するために単体テストを作成したいと思います。 SQLDeveloperでテストしましたが、テストデータベース上で実行したいときに機能しますが、後でこのコードを維持する必要がある人に単体テストを残したいと思います。SQLクエリを実行するメソッドをテストする方法

​​

私の考えは、上記の基準とし1を満たしていないそのうちの3つ4枚の請求書を作成することでした。私が立ち往生しているところは、クエリが1つのレスポンスだけを返すかどうかをチェックする方法です。クエリの1つの行が出ていることをどのようにテストするのですか?私はモデルを埋めるためにこれらの請求書にFactoryGirlと&旅行を作成する上で意図された

明確化 。ウィルはまだ動作しますか?

+0

一般に、単体テストは外部サービスに依存すべきではありません。典型的な単体テストは、テストデータベースからの応答を疑似し、返されたデータの処理が適切に行われているかどうかをテストします。これは、そのデータベースに依存する単体テストを作成すると、データベース実装を変更するたびに単体テストを変更する必要があるためです。これは単なる単体テストではなく、統合テストです。 TLDR:これを行うことはできますが、それは悪い考えです。さらに詳しい情報はこちら:http://stackoverflow.com/questions/10752/what-is-the-difference-between-integration-and-unit-tests – nhouser9

+0

なぜ単体テストがデータベースと対話できないのか分かりません。 db実装を変更することは、実際には起こりそうにないため、実際には問題にはならず、そうであれば、このテストはデータベースに取り除かれます。 –

+0

@BSeven単体テストが外部サービスと通信を開始するとき、単体テストではありません。これらは統合テストであり、個別に管理する必要があります。 – nhouser9

答えて

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)のテストを1つ作成できます。それは、すべての条件に対して1つのテストを行うよりも読みやすいかもしれません。

+0

その後、 'assert_equal 1、report.count'のようなアサーションのようなテスト? – CheeseFry

+1

私は特定のレコードについてもテストします: 'assert_equal valid_invoice、report.first'。 –

関連する問題