四角形


ボブ:私のテストはとても長い!
スティーブ:なぜ彼らはそんなに長くかかりますか?
ボブ:私のレコードを作成し、データベースに保存する永遠にかかる!
スティーブ:なぜあなたの記録は永遠にあなたのテスト実行に影響を与えるか?
ボブ:私の論理がデータベースにものを引っ張って、格納しているので、私はそれをテストする必要があります.
スティーブ:なぜあなたのロジックは、データベースに引っ張って格納されていますか?
ボブ:Uhhh ...それは私がどのようにレールを書く方法を学びましたか?あなたは約六角形について私に講義をしていないですか?
スティーブ:いいえ、しかし、あなたは人々が通常レールを書く方法で、速いテストスイートを見ましたか?
ボブ:いいえ、しかし、私はあなたが何かについて行っているように感じます.
Steve :したがって、高速テストスイートの鍵は、できるだけ多くの状態を扱うことから論理の扱いを切り離すことです.それはほとんどの場合かなり簡単です.まず、データベースからデータを展開します.次に、データのロジックを実行します.最後に、トランザクション内のデータベースに結果を保存します.それは何を得るのですか?
ボブ:私は、あなたがビジネスロジックの中で高価なデータベース依存関係を持っていないと思います.
Steve :はい、完全なユニットのテストは成功と失敗を必要とします.なぜなら、トランザクションが実行し成功しない限り、どれも問題ないからです.
ボブ:thatsすべてのですが、ActiveRecordは、データベースを照会することができるように多くのメソッドを持って、それは簡単に取得取得することです.
スティーブ:はい、それはトリッキーなものです.接続を無効にするようなことができます.たとえば、既存の接続指定に切り替えることでデータベースを呼び出すのを防ぎます.
class ApplicationRecord
  def self.with_no_connection!(&block)
    old_name = connection_specification_name
    self.connection_specification_name = 'with_no_connection active'
    yield
    self.connection_specification_name = old_name
  end
end
ボブ:私はテスト中にそれを使うことができました、しかし、私がテスト懸念から500 sを得ないように、生産ででなく.
class ApplicationRecord
  def self.with_no_connection(&block)
    if Rails.env.test?
      with_no_connection!(&block)
    else
      block.call
    end
  end
end
スティーブ:良いコール.
ボブ:もう1回以上行ってください.我々は、ロジック内のデータベースへの呼び出しを回避することにより、テスト速度を向上させます.まずすべての必要なデータを抽出し、データのロジックを実行し、データベースに最後に保存します.少しの例はありますか.
スティーブ:それは正しい.以下にコントローラの例を示します:
class MovesController < ApplicationController
  def create
    # query db, build objects
    person = Person.include(:places).find(params[:id])
    old_place = person.current_place
    new_place = Place.find_by(params[:new_address])

    # pass objects to stateless logic
    ApplicationRecord.with_no_connection {
      Move.call(person, old_place, new_place)
    }

    # save state in transaction
    transaction do
      person.save!
      old_place.save!
      new_place.save!
    end

    head :no_content
  end
end
ボブ:それは通常のレールにかなり近いように見えます、そして、移動テストで私はデータベースで何も必要としません!面白い.この記事のタイトルは何ですか?
Steve :四角形は六角形のプレイですが、4部しかありません.コントローラ、状態、ロジック、ビュー.